Служба WCF, размещенная на IIS, не работает - PullRequest
3 голосов
/ 28 марта 2012

Я хочу создать службу, которая предоставляет базовую конечную точку HTTTP и конечную точку webHTTP. Если я тестирую следующий проект с VS2010 в рабочем режиме, все в порядке; но я хочу разместить службу в IIS (локально или удаленно) и пройти тесты.

Service.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="ContactLibrary.ContactLibraryService"%>

Я размещаю свой веб-сайт в локальном IIS. Когда я пытаюсь: http://localhost/ContactLibrary2.0/Service.svc, я получаю:

Тип 'ContactLibrary.ContactLibraryService', предоставленный как значение атрибута Service в директиве ServiceHost или предоставленный в элементе конфигурации system.serviceModel / serviceHostingEnvironment / serviceActivations, не найден.

Web.config выглядит так:

<?xml version="1.0"?>
<configuration>    
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ContactLibraryNamespace.ContactLibraryService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
          name="soap" contract="ContactLibraryNamespace.IContact" />
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
          name="mex" contract="IMetadataExchange" />
        <endpoint address="rest" behaviorConfiguration="web" binding="webHttpBinding"
          bindingConfiguration="" name="rest" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/ContactLibrary2.0" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>      
</configuration>

IContact выглядит так:

[ServiceContract]
    public interface IContact
    {
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "GetContact/{idContact}", ResponseFormat = WebMessageFormat.Json)]
        Contact GetContact(string idContact);
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "AddContact", RequestFormat = WebMessageFormat.Json)]
        string AddContact(Contact contact);
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "EditContact", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
        string EditContact(string idContact, Contact Contact);
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "DeleteContact", RequestFormat = WebMessageFormat.Json)]
        string DeleteContact(string idContact);
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "GetAllContacts/{start}/{end}", RequestFormat = WebMessageFormat.Json)]
        List<Contact> GetAllContacts(string start, string end);        
    }

1 Ответ

2 голосов
/ 28 марта 2012

В вашем файле SVC вам нужно связать код, как показано ниже:

<%@ ServiceHost Language="C#" Debug="true" Service="ContactLibraryNamespace.ContactLibrarySOAPService" CodeBehind="ContactLibrarySOAPService.svc.cs" %>

Вам не нужно иметь отдельные классы для использования BasicHttpBinding и webHttpBinding.

Просто изменитеваш интерфейс IContact приведен ниже:

[ServiceContract]
    public interface IContact
    {
        [OperationContract]
        [WebInvoke(Method="GET", UriTemplate = "GetContact/{idContact}", ResponseFormat=WebMessageFormat.Json)]
        Contact GetContact(string idContact);
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "AddContact", RequestFormat = WebMessageFormat.Json)]
        string AddContact(Contact contact);
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "EditContact", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
        string EditContact(string idContact, Contact Contact);
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "DeleteContact", RequestFormat = WebMessageFormat.Json)]
        string DeleteContact(string idContact);
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "GetAllContacts/{start}/{end}", RequestFormat = WebMessageFormat.Json)]
        List<Contact> GetAllContacts(string start, string end);        
    }

Затем измените ваш элемент службы в вашей конфигурации на:

<system.serviceModel>
    <services>
      <service name="ContactLibraryNamespace.ContactLibrarySOAPService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
         contract="ContactLibraryNamespace.IContact" />
        <endpoint address="rest" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="" contract="ContactLibraryNamespace.IContact" />
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
         contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/ContactLibrary2.0" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
       <endpointBehaviors>
        <behavior name="web">
          <webHttp />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
        <behavior name="json">
          <enableWebScript />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Это сделает ваш интерфейс IContact доступным через SOAP и REST.

Единственным изменением будет URL-адрес конечной точки REST, который будет http://localhost/virtualDirectoryname/ContactLibrarySOAPService.svc/rest/resourcename

ПРИМЕЧАНИЕ. Измените имя класса, реализующего IContact, чтобы сделать его универсальным, а не иметь слово SOAP илиОТДЫХ, чтобы избежать путаницы.

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