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,但我得到了同样的错误。我虽然这是如何创建一个问题,所以这就是为什么我硬编码的请求(工程),但仍然没有运气。
默认情况下,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
Hi Timo!你能提供更多的信息,以便我可以帮助回答你的问题吗?特别是:您使用的是什么版本的Titanium Mobile SDK?你正在测试什么版本的iOS模拟器或Android模拟器?几天后,我还可以打那台测试服务器吗?我会帮你获得一些工作代码,或者我会确保报告一个错误,以便我们能够解决任何阻碍你进展的潜在问题。后来! –