Сервис wcf не позволяет POST

Я совершенно новичок в веб-сервисах в целом и застрял (я думаю) в настройке IIS и самого веб-сервиса.

Я создал веб-сервис wcf в MVS 2010 и разместил его на IIS7.5 в Windows 7. Я использую soapUI 4.5.0 для публикации сообщения, созданного на основе того же описания wsdl, с которым я заключил контракт на веб-сервис. Проблема в том, что я получаю 405 из-за того, что http POST не поддерживается веб-сервисом или веб-сервером.

Несмотря на то, что у меня была идея, что ошибки, которую я получу, будет достаточно для решения моей проблемы, мое отсутствие знаний о IIS и веб-сервисах не позволяет мне найти правильное решение.

Ниже столько информации, сколько я мог придумать. Надеюсь, что это поможет, и кто-то может направить меня в правильном направлении.

Конфигурации, сделанные в IIS:

Правило авторизации: разрешить всем пользователям

Directory browsing: enabled Handler mappings: features permissions: read, script and execute Handler mappings: added *.wsdl -> ProtocolSupportModule -> GET, HEAD, OPTIONS, TRACE, POST Application pools: added entry with identity NetworkService using .net fw 4.0

Это сообщение отправлено:

RAW: POST http: x.x.x.x: 21378 / HTTP / 1.1 Accept-Encoding: gzip, выкачать Тип содержимого: application / soap + xml; charset = UTF-8; action = & quot; / BootNotification & quot;

XML:

<soap:Envelope xmlns:soap="org/2003/05/soap-envelope" xmlns:ns="urn://Ocpp/Cs/2012/02/">
   <soap:Header/>
   <soap:Body>
      <ns:bootNotificationResponse>
         <ns:status>Accepted</ns:status>
         <ns:currentTime>${now}</ns:currentTime>
         <ns:heartbeatInterval>900</ns:heartbeatInterval>
      </ns:bootNotificationResponse>
   </soap:Body>
</soap:Envelope>

Это результат возвращается:

Я усек это, чтобы ограничить размер этого поста.

RAW: HTTP / 1.1 405 метод не разрешен Cache-Control: приватный Разрешить: GET, HEAD, OPTIONS, TRACE Content-Type: text / html; кодировка = UTF-8 Сервер: Microsoft-IIS / 7.5 X-Powered-By: ASP.NET Дата: четверг, 07 июня 2012 г. 07:58:09 GMT Контент-длина: 5611

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns=".org/1999/xhtml"> 
<head> 
<title>IIS 7.5 Detailed Error - 405.0 - Method Not Allowed</title> 
<style type="text/css"> 

...
...
...

<div class="content-container"> 
 <fieldset><legend>Most likely causes:</legend> 
  <ul>  <li>The request sent to the Web server used an HTTP verb that is not allowed by the module configured to handle the request.</li>   <li>A request was sent to the server that contained an invalid HTTP verb.</li>  <li>The request is for static content and contains an HTTP verb other than GET or HEAD.</li>    <li>A request was sent to a virtual directory using the HTTP verb POST and the default document is a static file that does not support HTTP verbs other than GET or HEAD.</li> </ul> 
 </fieldset> 
</div> 
<div class="content-container"> 
 <fieldset><legend>Things you can try:</legend> 
  <ul>  <li>Verify the list of verbs enabled for the module handler this request was sent to, and ensure that this verb should be allowed for the Web site.</li>    <li>Check the IIS log file to see which verb is not allowed for the request.</li>   <li>Create a tracing rule to track failed requests for this HTTP status code. For more information about creating a tracing rule for failed requests, click <a href=".com/fwlink/?LinkID=66439">here</a>. </li> </ul> 
 </fieldset> 
</div> 


<div class="content-container"> 
 <fieldset><legend>Links and More Information</legend> 
  This error means that the request sent to the Web server contained an HTTP verb that is not allowed by the configured module handler for the request. 
  <p><a href="amp;IIS70Error=405,0,0x80070001,7601">View more information &raquo;</a></p> 

 </fieldset> 
</div> 
</div> 
</body> 
</html> 

XML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ".org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns=".org/1999/xhtml"> 
<head> 
<title>IIS 7.5 Detailed Error - 405.0 - Method Not Allowed</title> 
<style type="text/css"> 

...

</head> 
<body> 
<div id="header"><h1>Server Error in Application "SHENZIWEBSERVICEDEPLOYED"</h1></div> 
<div id="server_version"><p>Internet Information Services 7.5</p></div> 
<div id="content"> 
<div class="content-container"> 
 <fieldset><legend>Error Summary</legend> 
  <h2>HTTP Error 405.0 - Method Not Allowed</h2> 
  <h3>The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used.</h3> 
 </fieldset> 
</div> 
<div class="content-container"> 

...

</div> 
<div class="content-container"> 
 <fieldset><legend>Most likely causes:</legend> 
  <ul>  <li>The request sent to the Web server used an HTTP verb that is not allowed by the module configured to handle the request.</li>   <li>A request was sent to the server that contained an invalid HTTP verb.</li>  <li>The request is for static content and contains an HTTP verb other than GET or HEAD.</li>    <li>A request was sent to a virtual directory using the HTTP verb POST and the default document is a static file that does not support HTTP verbs other than GET or HEAD.</li> </ul> 
 </fieldset> 
</div> 
<div class="content-container"> 
 <fieldset><legend>Things you can try:</legend> 
  <ul>  <li>Verify the list of verbs enabled for the module handler this request was sent to, and ensure that this verb should be allowed for the Web site.</li>    <li>Check the IIS log file to see which verb is not allowed for the request.</li>   <li>Create a tracing rule to track failed requests for this HTTP status code. For more information about creating a tracing rule for failed requests, click <a href=".com/fwlink/?LinkID=66439">here</a>. </li> </ul> 
 </fieldset> 
</div> 


<div class="content-container"> 
 <fieldset><legend>Links and More Information</legend> 
  This error means that the request sent to the Web server contained an HTTP verb that is not allowed by the configured module handler for the request. 
  <p><a href=".com/fwlink/?LinkID=62293&amp;IIS70Error=405,0,0x80070001,7601">View more information &raquo;</a></p> 

 </fieldset> 
</div> 
</div> 
</body> 
</html> 

Это часть сгенерированного сервисного контракта (wsdl / language: CS / serverInterface

// CODEGEN: The optional WSDL extension element 'PolicyReference' from namespace 'http://schemas.xmlsoap.org/ws/2004/09/policy' was not handled.
[ServiceContract(Name = "CentralSystemServiceSoap", Namespace = "urn://Ocpp/Cs/2010/08/")]
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Web.Services.WebServiceBindingAttribute(Name="CentralSystemServiceSoap", Namespace="urn://Ocpp/Cs/2010/08/")]
public interface ICentralSystemServiceSoap {
    /// <remarks/>
    [OperationContract]
    [System.Web.Services.Protocols.SoapHeaderAttribute("chargeBoxIdentity")]
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("/BootNotification", RequestElementName = "bootNotificationRequest", RequestNamespace = "urn://Ocpp/Cs/2010/08/", ResponseElementName = "bootNotificationResponse", ResponseNamespace = "urn://Ocpp/Cs/2010/08/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute("status")]
    RegistrationStatus BootNotification(string chargePointVendor, string chargePointModel, string chargePointSerialNumber, string chargeBoxSerialNumber, string firmwareVersion, string iccid, string imsi, string meterType, string meterSerialNumber, out System.DateTime currentTime, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool currentTimeSpecified, out int heartbeatInterval, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool heartbeatIntervalSpecified);

Ответы на вопрос(1)

Я не понимаю, как построен ваш сервис и что вы там сделали, но из моего опыта это простой способ создать сервис RESTful wcf, который поддерживает запросы POST:

http://www.codeproject.com/Articles/201901/CREATE-RESTful-WCF-Service-API-Using-POST-Step-By

Update according to the comments:

попробуйте использовать это:

[OperationContract]
[WebInvoke(Method = "POST")]
[System.Web.Services.Protocols.SoapHeaderAttribute("chargeBoxIdentity")]
[System.Web.Services.WebMethodAttribute()]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("/BootNotification", RequestElementName = "bootNotificationRequest", RequestNamespace = "urn://Ocpp/Cs/2010/08/", ResponseElementName = "bootNotificationResponse", ResponseNamespace = "urn://Ocpp/Cs/2010/08/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute("status")]
RegistrationStatus BootNotification(string chargePointVendor, string chargePointModel, string chargePointSerialNumber, string chargeBoxSerialNumber, string firmwareVersion, string iccid, string imsi, string meterType, string meterSerialNumber, out System.DateTime currentTime, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool currentTimeSpecified, out int heartbeatInterval, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool heartbeatIntervalSpecified);

UPDATE

попробуйте сделать это:

На IIS 7.5 - & gt; Ваш сайт - & gt; Отображения обработчиков

Выберите & quot; Добавить сопоставление модулей & quot; опция на правой стороне панели

В & quot; Запросить путь & quot; поле введите * .wsdl

В & quot; модуле & quot; в поле введите «ProtocolSupportModule»

Нажмите & quot; Запросить ограничения & quot; и перейдите на вкладку глаголов

Введите глагол POST

Сохранить изменения

 MarcelS07 июн. 2012 г., 14:31
Я попробую это и разберу привязку webhttpbinding ict wshttpbinding и basichttpbinding. Не знаю точно, в чем заключаются конкретные различия.
 MarcelS07 июн. 2012 г., 14:16
Спасибо за быстрый ответ. Ссылка полезна, и я видел ее раньше, но не смог связать ее с моей проблемой. Я рассмотрю это более внимательно. Я добавил часть сгенерированного контракта в пост.
 07 июн. 2012 г., 14:42
Следите за последним обновлением
 07 июн. 2012 г., 14:20
Я не уверен в этом, но попробуйте добавить '[WebInvoke (Method = & quot; POST & quot;)] "& apos; свойство под вашим [OperationContract] свойством
 MarcelS07 июн. 2012 г., 14:38
Я добавил свойство, но без эффекта на результат. Тем не менее ответ говорит мне только: Разрешить: GET, HEAD, OPTIONS, TRACE разрешены. У меня также есть идея, что отвечает не веб-сервис, а веб-сервер. Это возможно? Что веб-сервер не позволяет веб-сервису обрабатывать сообщение, но отфильтровывает его?

Ваш ответ на вопрос