wcf服务内部服务器错误

问题描述:

我创建了一个公开GetData方法的简单wcf服务。它实际上是创建新的wcf项目时创建的模板。wcf服务内部服务器错误

我添加应用到IIS服务器,因此它可以从外部被访问,这样的:http://192.168.0.100/TFSWrapper/Service1.svc

我使用的通用肥皂客户端发送到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> 

顺便说,我删除从该方法的参数和硬编码一个返回值。

正如你所看到的,一切正常,因为它应该。

接下来,我创建了一个钛客户端调用相同的服务。我使用了上面的确切肥皂请求,只是为了确保。

基本上我这样做:

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内部服务器错误”响应:

与操作该消息“http://tempuri.org/GetData”不能 处理在接收机处,由于在 EndpointDispatcher一个ContractFilter失配。这可能是因为发件人和收件人之间的合同不匹配 (发件人和收件人之间的不匹配操作)或绑定/安全 不匹配。检查发件人和 接收者是否具有相同的合同和相同的绑定(包括 安全要求,例如消息,传输,无)。

起初我使用钛皂api创建请求xml,但我得到了同样的错误。我虽然这是如何创建一个问题,所以这就是为什么我硬编码的请求(工程),但仍然没有运气。

+0

Hi Timo!你能提供更多的信息,以便我可以帮助回答你的问题吗?特别是:您使用的是什么版本的Titanium Mobile SDK?你正在测试什么版本的iOS模拟器或Android模拟器?几天后,我还可以打那台测试服务器吗?我会帮你获得一些工作代码,或者我会确保报告一个错误,以便我们能够解决任何阻碍你进展的潜在问题。后来! –

默认情况下,WCF服务OperationContracts只能使用HTTP POST调用。当您在Titanium HTTPClient上调用open()时,是否为HTTP方法参数指定了GET或POST?

其次,由于您的服务使用SOAP绑定1.1,你需要传递一个SOAPAction头在你的要求,使WCF能够将消息路由到GetData方法。如果该服务的OperationContract特性没有指定动作参数时,动作要由命名空间和服务合同名后面的方法名称(可能http://tempuri.org/IService1/GetData,如果你用的是什么默认的WCF应用程序创建)。你还需要指定一个内容类型。所以,你需要设置你的XHR像在此之前调用send:

xhr.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