【问题标题】:500 Internal Server Error on a self hosted WCF Service自托管 WCF 服务上的 500 内部服务器错误
【发布时间】:2013-08-10 17:05:26
【问题描述】:

我正在尝试开发一个使用 ServiceHost 对象托管的新 WCF 服务。我能够启动控制台应用程序,并且可以看到它通过 netstat 绑定到端口 80。使用 WireShark,我还可以看到客户端能够连接到该端口并发送数据。我很早就遇到了客户端在 SOAP 消息中发送的数据量的问题,但能够通过在绑定上设置最大接收大小来解决该问题。我得到的 HTTP 500 错误是:

由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action '' 的消息。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。

以下是我的 WCF 代码和我的服务代码。

public class MyWCFService
{
    private ServiceHost _selfHost;

    public void Start()
    {
        Uri baseAddress = new Uri(@"http://192.168.1.10");

        this._selfHost = new ServiceHost(typeof(MyServiceImpl), baseAddress);

        try {
            WebHttpBinding binding = new WebHttpBinding();
            binding.MaxBufferSize = 524288;
            binding.MaxReceivedMessageSize = 524288;
            this._selfHost.AddServiceEndpoint(typeof(IMyServiceContract), binding, "MyService");

            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            this._selfHost.Description.Behaviors.Add(smb);

            this._selfHost.Open();
        }
        catch ( CommunicationException ce ) {
            this._selfHost.Abort();
        }
    }

    public void Stop()
    {
        this._selfHost.Close();
    }
}

以下是我的服务合同。它相当简单,只有一个操作。预计将在收到基于 SOAP 的消息时调用它。

[ServiceContract(Namespace = "http://www.exampe.com")]
public interface IMyServiceContract
{
    [OperationContract (Action="http://www.example.com/ReportData", ReplyAction="*")]
    string ReportData( string strReport );
}

以下是我的服务契约的实现

class MyServiceImpl : IMyServiceContract
{
    public string ReportData( string strReport )
    {
        return "ok";
    }
}

这是我从客户那里得到的信息(strReport 很长,所以我将其排除在外)

POST /MyService HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://www.example.com/ReportData"
Host: 192.168.1.10
Content-Length: 233615
Expect: 100-continue
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<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>
        <ReportData xmlns="http://www.example.com/">
            <strReport>
                ........
            </strReport>
        </ReportData>
    </soap:Body>
</soap:Envelope>

任何解决此问题的帮助将不胜感激。

问候, 理查德

【问题讨论】:

  • 欢迎来到 SO,并给其他第一张海报留言;这就是你的第一篇文章的样子! +1

标签: wcf


【解决方案1】:

您希望您的服务是 SOAP 服务还是 REST 服务?

在服务端,它被配置为一个REST服务(因为你使用的是WebHttpBinding)。但是,来自您的客户端的请求是一个 SOAP 请求。如果您的客户端是 WCF 客户端,它可能正在使用 wsHttpBinding 或 basicHttpBinding。这两个都是针对 SOAP 的。

您可以:

  1. 更改您的服务以使用 basicHttpBinding 或 wsHttpBindding 来匹配您的客户端(如果您想使用 SOAP),或者
  2. 将您的客户端更改为使用 webHttpBinding(如果您想使用 REST)。这将需要更多更改,因为您的操作合同未正确归因于 REST。无论如何,WCF 不是 REST 的好选择。 ASP.Net Web API 更简单,支持更好。

还有

  1. 在您的操作合同中指定的 Action 应该只是 ReportData 而不是命名空间限定的版本。事实上,您可能根本不需要它。
  2. 您可以删除 ReplyAction(或在您的客户需要时指定适当的值)

一般情况下,您不需要指定这些。我不是 SOAP 内部的专家,但我相信如果您不指定这些值,WCF 会根据方法名称指定这些值。 .Net 中方法名称的唯一性将确保在这种情况下操作/回复操作是唯一的。

有了这些更改它可以在我的机器上运行 (TM)

【讨论】:

  • 服务必须是基于 SOAP 的服务。我确实对 BasicHttpBinding 进行了更改,但这似乎并没有解决我的问题。我之前没有做过自托管 WCF 服务,所以我不确定我是否做得正确,或者这是否是我的问题的一部分。我有四个基于 Web API 的服务,它们是自托管的并且运行良好。至于尝试连接到我的服务的客户端,我真的不知道它是用什么语言编写的。它是我尝试与之集成的第三方供应商。
  • 您的服务定义中有几个错误。所以我更新了我的答案。
  • 迈克,看来我需要做的只是进行您推荐的更改,并在我的 [ServiceContract(Namespace="example.com/")] 末尾添加 / 。这两个更改似乎都已解决我的问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-05-08
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多