c# - IIS 上托管的 WCF 服务无法正常工作

标签 c# json wcf soap

我想构建一个公开 basicHTTP 端点和 webHTTP 端点的服务。如果我在运行模式下用 VS2010 测试以下项目,一切都很好;但我想在 IIS(本地或远程)中托管该服务并通过测试。

服务.svc:

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

我将我的网站托管到本地 IIS。当我尝试时:http://localhost/ContactLibrary2.0/Service.svc我得到:

The type 'ContactLibrary.ContactLibraryService', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.

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);        
    }

最佳答案

在您的 svc 文件中,您需要关联后面的代码以及如下所示:

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

使用 BasicHttpBinding 和 webHttpBinding 不需要单独的类。

只需将您的 IContact 接口(interface)更改为以下内容:

[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>

这样做会公开可通过 SOAP 和 REST 访问的接口(interface) IContact。

唯一的变化是 REST 端点 url 为 http://localhost/virtualDirectoryname/ContactLibrarySOAPService.svc/rest/resourcename

注意:更改实现 IContact 的类的名称以使其通用,而不是使用 SOAP 或 REST 一词以避免混淆。

关于c# - IIS 上托管的 WCF 服务无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903218/

相关文章:

c# - 分页上下限

c# - RichTextBox 从右到左选项中的错误

json - JSON模式中'$ id'属性的用法

c# - 出现异常 WCF/IIS7.0 实现 NHibernate.HibernateException : Creating a proxy instance failed

C# 获取控件在窗体上的位置

c# - AutoFixture,创建电子邮件地址列表

json - 如何使用 Stomp/JSON 在 ActiveMQ 中使用 JMS 消息转换

python - 如何在 Django 中渲染缓存的 JSONP View

asp.net - 缓存 WCF 服务并将数据转换为异步

wcf - WCF 回调如何通过 HTTP 工作?