【问题标题】:wcf service Internal server errorwcf 服务内部服务器错误
【发布时间】:2011-08-05 22:53:26
【问题描述】:

我创建了一个简单的 wcf 服务,它公开了一个 GetData 方法。其实就是新建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 不匹配,在接收方处理 端点调度程序。这可能是因为合同不匹配 (发送方和接收方之间的操作不匹配)或绑定/安全性 发送者和接收者之间的不匹配。检查发件人和 接收方具有相同的合同和相同的约束力(包括 安全要求,例如消息,传输,无)。

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

【问题讨论】:

  • 嗨蒂莫!您能否提供更多信息,以便我帮助回答您的问题?特别是:您使用的是什么版本的 Titanium Mobile SDK?您正在测试哪个版本的 iOS 模拟器或 Android 模拟器?几天后我还能访问那个测试服务器吗?我会帮助您获得一些工作代码,或者我会确保报告错误,以便我们可以修复任何阻碍您前进的潜在问题。稍后!

标签: javascript wcf iis soap titanium


【解决方案1】:

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

其次,由于您的服务绑定使用的是 SOAP 1.1,因此您需要在请求中传递一个 SOAPAction 标头,以便 WCF 可以将消息路由到 GetData 方法。如果在服务的 OperationContract 属性中未指定 Action 参数,则 Action 应该是方法名称,前面是命名空间和服务合同名称(如果您使用的是 http://tempuri.org/IService1/GetData '正在使用默认 WCF 应用程序创建的内容)。您还需要指定内容类型。因此,您需要在调用 send 之前像这样设置您的 xhr:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多