如何在我的网站上托管我的 WCF 服务?

Posted

技术标签:

【中文标题】如何在我的网站上托管我的 WCF 服务?【英文标题】:How to host my WCF service in my website? 【发布时间】:2012-05-09 14:07:56 【问题描述】:

我是 WCF 的新手。我开发了一个示例 WCF 服务。我的服务使用basicHttp 绑定。

我使用 WAS 在本地 IIS 7.5 中托管我的服务,它运行良好。现在我想在我的网站上托管我的服务。

我在 Google 上搜索,但其中大多数都托管在 IIS 的 localhost 中。请告诉我该怎么做?最好参考一些教程或分步指南。

【问题讨论】:

参见:How to Host a WCF service in IIS - 无论是 localhost 还是任何其他服务器都完全不相关 - 只需按照这些步骤操作即可。 【参考方案1】:

我相信你基本上有两种选择:

选项 1 - “bin”部署(首选选项)

    将您的 WCF 服务编译成 DLL(类库) 在 IIS 中创建网站 将 WCF DLL 复制到网站的 .\bin 文件夹中 在该网站中创建一个*.svc 文件 在网站文件夹中添加适当的web.config 以定义您的端点和服务配置等。

您的 WCF 服务现在可以通过网站的基本地址以及*.svc 文件的名称访问,例如

http://myserver/someweb/Myservice.svc

您的*.svc 看起来像这样:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="WCF_Simple_Service.HelloIndigoService"  %>

Service= 属性表示实现服务的类 - 完全符合其命名空间。

选项 2 - 将内容放入 App_Code

    在 IIS 中创建网站 将所有与 WCF 相关的 *.cs 文件直接放入 .\App_Code 文件夹中 在该网站中创建一个*.svc 文件 在网站文件夹中添加适当的web.config 以定义您的端点和服务配置等。

您的 WCF 服务现在可以通过网站的基本地址以及*.svc 文件的名称访问,例如

http://myserver/someweb/Myservice.svc

您的*.svc 看起来像这样:

<%@ ServiceHost Language="C#" Debug="true" 
    Service="Service" 
    CodeBehind="~/App_Code/Service.cs" %>

一个简单的示例web.config 可能看起来像这样:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="WithDebug">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  <services>
    <service name="SimpleWCF.HelloIndigoService" behaviorConfiguration="WithDebug">
      <endpoint
          address=""
          binding="basicHttpBinding"
          contract="SimpleWCF.IHelloIndigoService" />
      <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />
    </service>
  </services>
</system.serviceModel>

您基本上定义了您的&lt;service&gt; 标记-再次:name= 表示实现服务的类-完全限定其名称空间。它必须至少包含一个端点——“mex”端点是可选的——但非常有用,尤其是对于开发和测试。它允许客户端“发现”服务并获取其服务描述,以便与​​它进行交互。

在 IIS 中部署您的服务后,您可以使用 WCF 附带的免费工具 WCF Test Client 或通用 SOAP 测试实用程序 SoapUI(免费版)等工具查看它的运行情况供您使用)。

【讨论】:

选项 2 中的错误 behaviorConfiguration="true" 正确的是 behaviorConfiguration="WithDebug" @PavelJedlicka:你是绝对正确的 - 感谢您指出这个错误 - 已修复!【参考方案2】:

旧线程,如果有人找到它...但是您也可以在 global.asax 中创建而不是您的 *.svc:

static Global()

    RouteTable.Routes.Add(new ServiceRoute("ExternalServices/SOAP/test", new     ninjectServiceHostFactory(), typeof(testService)));

【讨论】:

我面临着类似的问题。你能详细说明你的答案吗? @mav3n:如果您正在托管一个网站并且想要托管 WCF 服务(在您的网站中),那么您可以在 global.asax 中添加上面的代码。这样您就不需要添加单独的 *.svc 文件。您将像往常一样创建服务。在我的示例中,我使用了 Ninject,但显然您可以使用默认构造函数。【参考方案3】:

除了 Marc 的回答之外,如果您将工厂属性添加到您的 *.svc 文件中,如下所示,您无需更改主项目中的 web.config 文件中的任何内容。让我再重复一遍。 web.config 文件中没有大量混乱,保持原样。这是因为 svc 文件中的 Factory 属性会小心处理。

<%@ ServiceHost Language="C#" Debug="true" Service="WCF_Simple_Service.HelloIndigoService" Factory="System.ServiceModel.Activation.WebServiceHostFactory"  %>

但我必须说,当您调用您的服务时,它会给出端点未找到错误。但是当你在你的服务中调用你的方法时,它们都会起作用。在 restful wcf 中测试。

【讨论】:

以上是关于如何在我的网站上托管我的 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务 - ASP.net 托管 - 单点登录,如何传递凭据

如何在 Sql Server 上设置安全性以允许 WCF 服务访问?

如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?

我可以在我的自托管 WCF 应用程序中使用 Let's Encrypt 证书吗?

WCF 托管在 IIS6 上

在 IIS 中托管 WCF 服务时如何避免 CommunicationObjectFaultedException?