Заголовки SOAP в ошибке REST WCF - PullRequest
4 голосов
/ 02 ноября 2011

У меня есть эта ошибка:

Операция 'GetFields' в контракте 'IService' использует MessageContract с заголовками SOAP.Заголовки SOAP не поддерживаются None MessageVersion.

Проблема заключается в том, что моя операция использовалась двумя конечными точками: CustomEndpoint with messageVersion = "Soap12WSAddressing10" и вторым webHttpBehavior.

И ядумаю, что эта ошибка запускает проблему, что у Rest есть MessageVersion.None

Любой способ исправить это?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

К сожалению, в WCF RESTfulness имеет тенденцию быть функцией уровня контракта.Это означает, что вы часто не можете использовать контракт RESTful в контексте без RESTful и наоборот.

У вас есть два варианта, и у каждого есть свои компромиссы.Во-первых, у вас может быть два отдельных контракта (один размечен для функций RESTful и «простой», не RESTful), оба из которых реализованы вашей службой WCF.Это требует, чтобы оба контракта имели идентичные сигнатуры методов, что не всегда возможно.

Второй вариант состоит в том, чтобы иметь две отдельные службы WCF, каждая из которых имеет свой собственный контракт и код обработки, но чтобы они оба вызывали операции разгрузки третьего класса, о котором они оба знают, который выполняет реальную работу.Это наиболее гибкое решение, но для вызова третьего класса требуется специальный код перевода в любом (или обоих) сервисе WCF.

1 голос
/ 07 июня 2012

Вам не нужно предоставлять другой интерфейс и / или реализующий класс обслуживания.

Если вы используете код в поведении, которое пытается использовать XXMessageHeaders через OperationContext, вы должны написать код, чтобы проверить, является ли MessageVersionв заголовках есть MessageVersion.None и вместо этого используйте WebOperationContext (из System.ServiceModel.Web).

У меня есть рабочий пример с тем же интерфейсом и тем же классом реализации.

 <services>            
    <service name="ExampleService" behaviorConfiguration="MyServiceBehavior">
        <endpoint name="ExampleService.BasicHttpBinding"
                  binding="basicHttpBinding"
                  contract="IExampleService"
                  address="" />

        <endpoint name="ExampleService.WebHttpBinding"
                  binding="webHttpBinding"
                  contract="IExampleService"
                  address="restful"   
                  behaviorConfiguration="webHttpRestulBehavior"    />
    </service>
</services>

<behaviors>
  <endpointBehaviors>

    <behavior name="webHttpRestulBehavior">
      <webHttp/> 
    </behavior>

  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceMetadata httpGetEnabled="true"  />
    </behavior>
  </serviceBehaviors>
</behaviors>

при условии, что .svc равен Example.svc

В IIS URL конечной точки будет выглядеть следующим образом:

"http://hostname:port/Example.svc"

дляWCF

для отдыха:

"http://hostname:port/Example.svc/restful/"

0 голосов
/ 18 апреля 2012

Я испытывал то же исключение, что и это, когда пытался объединить две службы; один, который использовал конечную точку SOAP, а другой - конечную точку REST.

Я думаю, что проблема в том, что WCF, похоже, не нравится видеть операции, которые используют MessageContract в в том же ServiceContract в качестве операции REST. Таким образом, я смог обойти это, разделив контракты на две части, а затем используя конечную точку REST, только реализовав операцию WebGet следующим образом:

[ServiceContract]
public interface IExampleSoapService : IExampleRestService
{
    [OperationContract]
    void SomeSoapOperation(ExampleMessageContract message);
}

[ServiceContract]
public interface IExampleRestService
{
    [OperationContract]
    [WebGet(UriTemplate = "/{id}", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    void SomeRestOperation(int id);
}

А затем в конфигурации:

<services>            
    <service name="ExampleService">
        <endpoint name="ExampleService.BasicHttpBinding"
                  binding="basicHttpBinding"
                  contract="IExampleSoapService"
                  address="soap" />
        <endpoint name="ExampleService.WebHttpBinding"
                  binding="webHttpBinding"
                  contract="IExampleRestService" />
    </service>
</services>

Когда я разбил контракты следующим образом, проблема, похоже, исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...