Конечная точка служб данных с ошибкой в ​​контракте System.Data.Services.IRequestHandler

Я получаю следующую ошибку при попытке создать конечную точку с контрактом 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 выдает эту ошибку, когда я пытаюсь использовать ее в конечной точке. Я довольно новичок в Data Services, поэтому я уверен, что мне не хватает чего-то, что кажется очевидным для всех остальных.

Спасибо

Редактировать:
В конце дня моя цель - использовать проверку подлинности сертификатов, поэтому, если есть способ сделать это, работая над этой проблемой, я открыт для нее. Я использовал этот пример.

1 ответ

Решение

Ты используешь basicHttpBinding, Измените это на webHttpBinding,

Другие вопросы по тегам