WCF REST и сервис SOAP без WebServiceHostFactory - PullRequest
7 голосов
/ 23 сентября 2011

Несмотря на чтение ряда сообщений, например ( Это кажется популярным ), я не могу представить свой сервис как несколько конечных точек, совместимых как с протоколом SOAP, так и с протоколом REST - моя проблема, кажется с

  Factory="System.ServiceModel.Activation.WebServiceHostFactory"

элемент в коде сервиса за страницей.

Если я пропущу это, моя конечная точка SOAP будет работать нормально, но моя конечная точка JSON не найдена. Если я вставлю строку, моя конечная точка REST поет как птица, а конечная точка SOAP приводит к «Конечная точка не найдена» на странице Service.svc.

Кажется, мои операции настроены стандартным способом, например:

    [OperationContract]
    [WebGet(UriTemplate = "/GetData", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    string GetData();

И файл конфигурации

 <endpoint address="rest" binding="webHttpBinding" contract=".IMeterService" behaviorConfiguration="REST" />

 <endpoint address="soap" binding="wsHttpBinding" contract="IMeterService" bindingConfiguration="secureBasic" />

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

Как мне этого добиться? Есть ли способ настроить конечную точку REST без атрибута System.ServiceModel.Activation.WebServiceHostFactory?

Заранее спасибо.

1 Ответ

5 голосов
/ 23 сентября 2011

Если вы не укажете фабрику в файле .svc, все конечные точки будут получены из файла web.config - WCF попытается найти элемент <system.serviceModel / service>, атрибут name которого полностью соответствует -квалифицированное имя класса обслуживания.Если он не найдет его, он добавит конечную точку по умолчанию (используя basicHttpBinding, если вы не изменили отображение по умолчанию).Похоже, это то, с чем вы сталкиваетесь.Убедитесь, что атрибут «name» элемента <service> совпадает со значением атрибута Service в файле .svc, и у вас должны быть хорошо работающие две конечные точки.

Еще одну вещь, которую вы можете попробоватьдля этого нужно включить трассировку в сервисе (уровень = информация), чтобы увидеть, какие конечные точки были фактически открыты в сервисе.Изображение ниже:

SvcTraceViewer image

Сервер для этого примера не имеет значения:

namespace MyNamespace
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        string Echo(string text);
    }
    public class Service : ITest
    {
        public string Echo(string text)
        {
            return text;
        }
    }
}

Service.svc не имеет заводской установки:

<% @ServiceHost Service="MyNamespace.Service" Language="C#" debug="true" %>

И web.config определяет две конечные точки, которые показаны в трассировках:

<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Information, ActivityTracing"
                propagateActivity="true">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelTraceListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add initializeData="C:\temp\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
                <filter type="" />
            </add>
        </sharedListeners>
        <trace autoflush="true"/>
    </system.diagnostics>
    <system.serviceModel>
        <behaviors>
            <endpointBehaviors>
                <behavior name="Web">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <services>
            <service name="MyNamespace.Service">
                <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
                    name="basic" contract="MyNamespace.ITest" />
                <endpoint address="web" behaviorConfiguration="Web" binding="webHttpBinding"
                    bindingConfiguration="" name="web" contract="MyNamespace.ITest" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

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

Вы можете попробовать сравнить эту настройку с вашей или начать с этой простой, затем запуститьдобавление компонента от вашего, пока вы не затронули проблему.Это поможет локализовать проблему.

Удачи!

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