2

尝试使用 System.Data.Services.IRequestHandler 合同创建端点时收到以下错误

无法加载操作“ProcessRequestForMessage”,因为它具有 System.ServiceModel.Channels.Message 类型的参数或返回类型,或者具有 MessageContractAttribute 和其他不同类型参数的类型。当使用 System.ServiceModel.Channels.Message 或带有 MessageContractAttribute 的类型时,该方法不得使用任何其他类型的参数。

我发现了另外两个与此错误有关的问题(此处此处),但它们都没有令人满意的解决方案。我提取了Northwind 示例并能够重现该问题。

简化的 web.config 文件:

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <system.serviceModel>
    <services>
      <service  name="NorthwindService.Northwind">
        <endpoint address="http://localhost:12345/Northwind.svc" binding="basicHttpBinding" contract="System.Data.Services.IRequestHandler" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

.svc 文件:

<%@ ServiceHost Language="C#" Factory="System.Data.Services.DataServiceHostFactory, Microsoft.Data.Services, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Service="NorthwindService.Northwind" %>

我可以通过用我自己的合同替换 System.Data.Services.IRequestHandler 合同并删除错误消息所抱怨的参数来摆脱错误。

引发错误的内置 ServiceContract:

namespace System.Data.Services
{
  [ServiceContract]
  public interface IRequestHandler
  {
    [OperationContract]
    [WebInvoke(UriTemplate = "*", Method = "*")]
    Message ProcessRequestForMessage(Stream messageBody);
  }
}

我的 ServiceContract,它不会抛出错误(但也没有真正起作用,因为我没有复制所有DataService<T>功能):

namespace NorthwindService
{
  [ServiceContract]
  interface Interface1
  {
    [OperationContract]
    [WebInvoke(UriTemplate = "*", Method = "*")]
    Message ProcessRequestForMessage();
  }
}

当我尝试在端点中使用内置 ServiceContract 时,我很困惑为什么会抛出此错误。我对数据服务相当陌生,所以我确信我错过了一些对其他人来说似乎很明显的东西。

谢谢

编辑:
归根结底,我的目标是使用证书身份验证,所以如果在解决这个问题时有办法做到这一点,我愿意接受。我一直在使用这个例子

4

1 回答 1

0

您正在使用basicHttpBinding. 将其更改为webHttpBinding.

于 2013-02-03T10:54:46.540 回答