我创建了一个公开GetData方法的简单wcf服务。它实际上是您创建新wcf项目时创建的模板。
我将应用程序添加到iis服务器,因此可以从外部访问它,如下所示:http://192.168.0.100/TFSWrapper/Service1.svc
我使用通用soap客户端向GetData方法发送请求。这是生成的soap请求:
<?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetData xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>
以下是肥皂反应:
<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetDataResponse xmlns="http://tempuri.org/">
<GetDataResult>You entered: 87</GetDataResult>
</GetDataResponse>
</s:Body>
</s:Envelope>
顺便说一下,我从方法中删除了参数并硬编码了一个返回值。
正如您所看到的,一切正常。
接下来,我创建了一个调用相同服务的Titanium客户端。我使用了上面的确切肥皂请求,只是为了确保。
基本上我这样做了:
var s='<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetData xmlns="http://tempuri.org/" /></soap:Body></soap:Envelope>';
//xhr.send(config.envelopeBegin+body+config.envelopeEnd);
xhr.send(s);
发送时,服务器返回“500内部服务器错误”响应以及以下错误字符串:
带有Action'http://tempuri.org/GetData'的消息不能 由于ContractFilter不匹配而在接收器处理 EndpointDispatcher。这可能是因为合同不匹配 (发送方和接收方之间不匹配的操作)或绑定/安全性 发送者和接收者之间不匹配。检查发件人和 接收者具有相同的合同和相同的约束力(包括 安全要求,例如消息,传输,无)。
起初我使用了钛皂api来创建请求xml,但是我得到了同样的错误。我虽然这是如何创建的问题,所以这就是为什么我硬编码一个请求(有效),但仍然没有运气。
答案 0 :(得分:2)
默认情况下,只能使用HTTP POST调用WCF Service OperationContracts。在Titanium HTTPClient上调用open()时,是否为HTTP方法参数指定了GET或POST?
其次,由于您的服务绑定使用SOAP 1.1,因此您需要在请求中传递SOAPAction标头,以便WCF可以将消息路由到GetData方法。如果未在服务的OperationContract属性中指定Action参数,则Action应为名称空间和服务合同名称前面的方法名称(如果您是 http://tempuri.org/IService1/GetData ,则可能是 http://tempuri.org/IService1/GetData '使用默认的WCF应用程序创建的内容)。您还需要指定内容类型。因此,在调用send:
之前,您需要像这样设置xhrxhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-16');
xhr.setRequestHeader('SOAPAction', '"http://tempuri.org/IService1/GetData"');
xhr.send(s);
此外,您可以显式指定WCF服务操作的操作:
[OperationContract(Action = "MyAction")]
string GetData()
{
// ...snip...
}
xhr.setRequestHeader('SOAPAction', '"MyAction"');
最后,您可以通过使用[WebGet]属性修改方法,通过HTTP GET调用服务操作。这允许以REST方式调用操作:http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx