尝试使用 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 时,我很困惑为什么会抛出此错误。我对数据服务相当陌生,所以我确信我错过了一些对其他人来说似乎很明显的东西。
谢谢
编辑:
归根结底,我的目标是使用证书身份验证,所以如果在解决这个问题时有办法做到这一点,我愿意接受。我一直在使用这个例子。