0

I'm quite new to webervices in general and am getting stuck in (I think) configuring IIS and the webservice itself.

I created a wcf webservice in MVS 2010 and hosted it on IIS7.5 on windows 7. I use soapUI 4.5.0 to post a message generated from the same wsdl description I created the webservice contract with. Issue is that I get 405 due to the fact that http POST not seems to be supported by the webservice or webserver.

Even though I had the idea the error I get would be sufficient to solve my problem, my lack of knowledge about IIS and webservices makes I can't find the right solution.

Below as much information as I could think of. Hope it is of any help and someone can guide me in the right direction.

Configurations made in IIS:

Authorization rule: allow, all users

  • 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

This is the message sent:

RAW: POST http: x.x.x.x:21378/ HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: application/soap+xml;charset=UTF-8;action="/BootNotification"

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>

This is the result returned:

I truncated it to limit the size of this post.

RAW: HTTP/1.1 405 Method Not Allowed Cache-Control: private Allow: GET, HEAD, OPTIONS, TRACE Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Thu, 07 Jun 2012 07:58:09 GMT Content-Length: 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> 

This is part of the generated servicecontract (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);
MarcelS
  • 41
  • 1
  • 3

1 Answers1

1

I didn't understand how your service is built and what you have done there, but from my experience, this is a simple way to create a wcf RESTful service that supports POST requests:

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

Update according to the comments:

try using that:

[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

try doing that:

On IIS 7.5 -> YourWebsite -> Handler Mappings

Choose "Add module mapping" option on the right side of the panel

In "Request path" field enter *.wsdl

In "Module" field enter "ProtocolSupportModule"

Click on "Request restrictions" and go to Verbs tab

Enter POST verb

Save changes

eyossi
  • 3,992
  • 18
  • 20
  • Thanx for the quick response. The link is helpfull, and I saw it before, but couldn't link it to my problem. I'll look into it more carefully. I added part of the generated contract to the post. – MarcelS Jun 07 '12 at 12:16
  • I am not sure about that but try adding the '[WebInvoke(Method = "POST")]' property under your [OperationContract] property – eyossi Jun 07 '12 at 12:20
  • I'll try that and sort out webhttpbinding ict wshttpbinding and basichttpbinding. Dont exactly know what the specific differences are. – MarcelS Jun 07 '12 at 12:31
  • I added the property, but with no effect on the result. Still the response tells me only: Allow: GET, HEAD, OPTIONS, TRACE are allowed. I also have the idea that not the webservice is replying this, but the webserver. Could that be possible? That the webserver doesn't let the webservice handle the post, but filters it out? – MarcelS Jun 07 '12 at 12:38
  • I did configure *.wsdl in handler mappings. – MarcelS Jun 07 '12 at 12:46
  • Jep, exactly like that. I found that tip before. – MarcelS Jun 07 '12 at 12:47
  • It seems that when I add "GET, HEAD, OPTIONS, TRACE, POST" to the staticfile handler, the response changes to "HTTP/1.1 404 Not Found". Does that ring a bel to you? I interpret it as that I ddin't specify the handler for it properly like you stated above, but it is present in the IIS configuration. Should I restart IIS for that maybe to take effect or something?! – MarcelS Jun 07 '12 at 13:07
  • Now try the code with the [WebInvoke(Method="Post")] attribute... that means that the IIS will allow post requests to pass to your service, and now you will have to configure your service to support it – eyossi Jun 07 '12 at 13:17
  • I think I found the issue in another corner. I called the webservice like: http://:/ Though, I didn't specify a default document for *.svc which is my wcf service. Meaining that the link with the handler cannot be found. Calling the webservice with http://:/myservice.svc does the trick. Though, it now complains about the content being "application/soap + xml" instead of "text/xml". I thought I could solve this with the binding wshttpbinding, but that doesn't change a thing. Am i correct in that wshttpbinding sets the expected content to application/soap + xml? – MarcelS Jun 07 '12 at 14:05