wcf service内部服务器错误

时间:2011-08-05 22:53:27

标签: javascript wcf iis soap titanium

我创建了一个公开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,但是我得到了同样的错误。我虽然这是如何创建的问题,所以这就是为什么我硬编码一个请求(有效),但仍然没有运气。

1 个答案:

答案 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:

之前,您需要像这样设置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