Служба WCF 4 с конечными точками REST / SOAP в IIS 7.5 - PullRequest
4 голосов
/ 13 апреля 2011

Здравствуйте и спасибо за чтение.

Я пытаюсь получить службу, размещенную в IIS 7.5, с несколькими открытыми конечными точками.

У меня ощущение, что проблема заключается в моем файле web.config, но я опубликую свой сервисный код здесь. Там нет файла интерфейса, так как я использую новые функции WCF 4, также нет файла .svc.

Вся маршрутизация, насколько я понимаю, обрабатывается в Global.asax.cs с использованием функции RouteTable.

Независимо от того, на код / ​​конфиг -

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
// NOTE: If the service is renamed, remember to update the global.asax.cs file
public class Service1
{
    // TODO: Implement the collection resource that will contain the SampleItem instances

    [WebGet(UriTemplate = "HelloWorld")]
    public string HelloWorld()
    {
        // TODO: Replace the current implementation to return a collection of SampleItem instances
        return "Hello World!";
    }
}

И теперь необходимо внести конфигурацию с изменениями, которые я думал (я не уверен, нужно ли мне сохранять блок standardEndpoints, но с ним или без него я все еще получаю сообщения об ошибках. -

<services>
  <service name="AiSynthDocSvc.Service1" behaviorConfiguration="HttpGetMetadata">
    <endpoint name="rest"
              address=""
              binding="webHttpBinding"
              contract="AiSynthDocSvc.Service1"
              behaviorConfiguration="REST" />
    <endpoint name="soap"
              address="soap"
              binding="basicHttpBinding"
              contract="AiSynthDocSvc.Service1" />
    <endpoint name="mex"
              address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>
</services>    

<behaviors>
  <endpointBehaviors>
    <behavior name="REST">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="HttpGetMetadata">
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<standardEndpoints>
  <webHttpEndpoint>
    <!-- 
        Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
        via the attributes on the <standardEndpoint> element below
    -->
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
  </webHttpEndpoint>
</standardEndpoints>

Файл Global.asax.cs остался один.

Опять же, я почти уверен, что это как-то связано с моим конфигом. Ошибка, которую я получаю, когда пытаюсь получить доступ к любой из определенных конечных точек, -

Конечная точка в '' не имеет привязки с None MessageVersion. «System.ServiceModel.Description.WebHttpBehavior» предназначен только для использования с WebHttpBinding или аналогичными привязками.

У кого-нибудь есть идеи по этому поводу?

Спасибо

Захари Картер

Ответы [ 2 ]

7 голосов
/ 13 апреля 2011

ОК, я пытался воспроизвести ваши вещи - мне это нравится: -)

  • Я использовал ваш класс обслуживания - без изменений
  • Я использовал ваш RegisterRoutesпозвоните по телефону global.asax.cs

Когда я запускаю веб-приложение из Visual Studio, я получаю Cassini (встроенный веб-сервер) на http://localhost:3131/ - это может быть опасно в вашем случае.

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

http://localhost:3131/Service1/HelloWorld
+--------------------+ 
 from Cassini
                     +--------+
                   name (first param) in ServiceRoute registration
                              +-----------+
                               from your URI template on the WebGet attribute

Работает ли у вас тот же URL ??

Обновление: вот мой конфиг - я могу подключиться к http://localhost:3131/Service1/HelloWorld в браузере, используя REST, и я могу подключиться к http://localhost:3131/Service1/soap с тестовым клиентом WCF, чтобы сделать вызов SOAP (мой Service1 живет в пространстве имен RestWebApp - таким образом, мои сервисные и контрактные имена несколько отличаются от ваших - но, кроме этого, я считаю, что они идентичны вашей собственной конфигурации):

  <system.serviceModel>
    <serviceHostingEnvironment     
        aspNetCompatibilityEnabled="true" />
    <services>
      <service name="RestWebApp.Service1" behaviorConfiguration="Meta">
        <endpoint name="rest" 
                  address=""
                  binding="webHttpBinding"
                  contract="RestWebApp.Service1"
                  behaviorConfiguration="REST" />
        <endpoint name="SOAP"
            address="soap"
            binding="basicHttpBinding"
            contract="RestWebApp.Service1" />
        <endpoint name="mex"
            address="mex"
            binding="mexHttpBinding"
            contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="REST">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Meta">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
        Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
        via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
0 голосов
/ 10 декабря 2012

Спасибо за это, это мне очень помогло.

Проблема в моем случае заключалась в том, что у меня было настроено поведение по умолчанию, содержащее webHttp.После присвоения ему имени = "REST" и установки моей конечной точки webHttpBinding поведение_Конфигурация = "REST" у меня больше не было ошибок.

<system.serviceModel>
<bindings>
  <customBinding>
    <binding name="CustomBinding_IMobileService">
      <binaryMessageEncoding />
      <httpTransport />
    </binding>
  </customBinding>
</bindings>
<client>
  <endpoint address="http://localhost:6862/silverlight/services/MobileService.svc"
    binding="customBinding" bindingConfiguration="CustomBinding_IMobileService"
    contract="AlchemyMobileService.IMobileService" name="CustomBinding_IMobileService" />
</client>
<services>
  <service name="MobileService.Alchemy">
    <endpoint address="http://localhost:8732/mobileservice" binding="webHttpBinding" contract="MobileService.IAlchemy" behaviorConfiguration="REST">
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="REST">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>

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