tags:

views:

41

answers:

1

Can anyone tell me what i can do to fix this error when i call a WCF SOAP service from JQuery?

Error:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"&gt;&lt;s:Body&gt;&lt;s:Fault&gt;&lt;faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none"&gt;a:ActionNotSupported&lt;/faultcode&gt;&lt;faultstring xml:lang="en-US">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></s:Fault></s:Body></s:Envelope>

If i use Fiddler to rebuild the request and add the SOAPAction http header portion, i get the same error except with the value i gave it.

Here is my web.config:

<configuration>
<system.web>
    <compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="soapBinding">
                <security mode="None">
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    <services>
        <service name="CatalogService" behaviorConfiguration="defaultBehavior">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="soapBinding" contract="ICatalogService"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="defaultBehavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

Here is my App_Code/CatalogService.cs:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]  public class CatalogService : ICatalogService  {
public string HelloWorld(string name){
    return String.Format("Hello {0}", name);}}

Here is my App_Code/CatalogIService.cs:

[ServiceContract(Namespace = "http://miami.edu/")]  public interface ICatalogService {
[WebInvoke(Method = "POST",
             BodyStyle = WebMessageBodyStyle.Wrapped,
             ResponseFormat = WebMessageFormat.Xml,
             RequestFormat = WebMessageFormat.Xml)]
string HelloWorld(string name);}

Here is my jQuery client code:

    $.ajax({
type: 'POST',
url: 'http://localhost/csw/service.svc/soap',
data: request,
contentType: 'text/xml; charset=utf-8',
dataType: 'text',
success: function (result) {
    console.log(result);

    $("#result").text(result);
    //result.responseXML
    //result.responseText
},
error: function (message) {
    console.log(message);
    alert("error has occured" + message);
}});

Here is my SOAP request:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"&gt;  <s:Body>  <HelloWorld xmlns="http://cstars.miami.edu/CatalogService"&gt;  <name>CarlosK</name>  </HelloWorld>  </s:Body>  </s:Envelope>
A: 

You are missing OperationContract attribute on your HelloWorld method. Than calling from Fiddler should work with SOAPAction http://miami.edu/ICatalogService/HelloWorld If it still doesn't work you can explicitly define Action and ReplyAction in OperationContract attribute.

To your jQuery problem. I just check $.ajax function in jQuery in action book and I think you need to define function to create SOAPAction header and assign that function to beforeSend in $.ajax.

Edit:

Based on this question and your previous question: Why do you want to use SOAP? It looks like you are developing service and client by yourselves. Do you have specific requirement to use SOAP or is it only some excercise? It is much easier to consume RESTful service from jQuery. RESTful service can return POX (plain old XML) or JSON.

Ladislav Mrnka
Excellent thanks. To answer your question, yes i would love to use REST but have specific OGC application profile requirements for http binding that require me to use SOAP.
krefftc