在Objective C(iOS应用程序)中请求WCF Web服务时收到SOAP错误

我正尝试从iOS应用程序调用Web服务。 我已经在WCF中开发了这个服务。 Web服务托pipe在使用BasicHTTPBindingconfiguration的IIS上。 我开发了一个简单的iOS应用程序,调用远程PC上托pipe的Web服务。

iOS应用程序工作正常,但SOAP服务似乎不理解我从iOS应用程序发送的请求。 这里是所有的细节,我得到的错误是在最后。

Web服务的WSDL是:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://tempuri.org/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="SLService" targetNamespace="http://tempuri.org/"> <wsdl:types> <xsd:schema targetNamespace="http://tempuri.org/Imports"> <xsd:import schemaLocation="http://10.211.55.4/TestService/SLService.svc?xsd=xsd0" namespace="http://tempuri.org/"/> <xsd:import schemaLocation="http://10.211.55.4/TestService/SLService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/> </xsd:schema> </wsdl:types> <wsdl:message name="ISLService_DoWork_InputMessage"> <wsdl:part name="parameters" element="tns:DoWork"/> </wsdl:message> <wsdl:message name="ISLService_DoWork_OutputMessage"> <wsdl:part name="parameters" element="tns:DoWorkResponse"/> </wsdl:message> <wsdl:portType name="ISLService"> <wsdl:operation name="DoWork"> <wsdl:input wsaw:Action="http://tempuri.org/ISLService/DoWork" message="tns:ISLService_DoWork_InputMessage"/> <wsdl:output wsaw:Action="http://tempuri.org/ISLService/DoWorkResponse" message="tns:ISLService_DoWork_OutputMessage"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="BasicHttpBinding_ISLService" type="tns:ISLService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="DoWork"> <soap:operation soapAction="http://tempuri.org/ISLService/DoWork" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="SLService"> <wsdl:port name="BasicHttpBinding_ISLService" binding="tns:BasicHttpBinding_ISLService"> <soap:address location="http://10.211.55.4/TestService/SLService.svc"/> </wsdl:port> </wsdl:service> </wsdl:definitions> 

这里是我如何在iOS中进行SOAP请求,问题很可能在这里:

 NSString *soapMessage = [NSString stringWithFormat:@"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Body><DoWork></DoWork></SOAP-ENV:Body></SOAP-ENV:Envelope>"]; NSURL *url=[NSURL URLWithString:@"http://10.211.55.4/TestService/SLService.svc/"]; NSMutableURLRequest *theRequest= [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [theRequest addValue: @"urn:SLService/DoWork" forHTTPHeaderField:@"SOAPAction"]; [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPMethod:@"POST"]; [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { responseData = [[NSMutableData data] retain]; } else { messageTextView.text=@"Failed"; } 

这里是WCF Web服务类中的内容:

 namespace TestSilverlight.Web{ public class SLService : ISLService { public string DoWork() { return "Service Works!"; } }} 

以下是WCF Web服务中的web.config文件的内容:

  <?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> </configuration> 

这里是我在responseData对象中得到的SOAP响应(错误):

a:ActionNotSupported由于EndpointDispatcher中的ContractFilter不匹配,无法在接收方处理Action'urn:ISLService / DoWork'的消息。 这可能是因为合同不匹配(发件人和收件人之间的操作不匹配)或发件人和收件人之间的绑定/安全不匹配。 检查发件人和收件人是否具有相同的合同和相同的绑定(包括安全要求,如消息,传输,无)。

我在这里勉强提问,希望你们能理解这一点。 请帮忙。

问题出在你的SOAPAction头上。 我怀疑这个问题是一样的调用wcf webservice使用basichttpbinding没有REST或JSON 。

解决scheme将是改变你的SOAPAction

 urn:SLService/DoWork 

 http://tempuri.org/SLService/DoWork 

甚至可能是

 http://tempuri.org/ISLService/DoWork