【问题标题】:Hosting a WCF service in an ASP.NET MVC app?在 ASP.NET MVC 应用程序中托管 WCF 服务?
【发布时间】:2009-08-13 09:25:39
【问题描述】:

我有一个非常大的 web 应用程序,它是用 MVC 构建的。我还将通用代码抽象为一个位于单独项目中的框架。希望这个框架能在不久的将来用于其他项目。有一些 Silverlight 应用程序是该框架的一部分,它们的工作之一是一次上传文件块。为了实现这一点,我希望他们与同样存在于框架项目中的 WCF 服务进行通信。我遇到了这个问题。

我将添加到我的服务框架项目的 app.config 数据 VS2008 复制到 web.config 中,但这似乎不起作用。

经过一番搜索,我发现您可以通过创建一个 .svc 文件和一个匹配的 .cs 文件来编写一个带有代码的服务,所以我尝试像这样创建 MyService.svc

<% @ServiceHost language="C#"
Service="MyFramework.MyService"
%>

由于我的服务存在于另一个项目中,因此没有要引用的文件隐藏代码,因此我认为 Namespace.Class 引用就足够了。

我还在 Global.asax 文件的 Ignored Routes 中添加了 MyService.svc/{*pathInfo}

但是,当我尝试浏览 localhost:x/MyService.svc,或者尝试使用 VS2008 中的添加服务工具查找服务时,它似乎挂起。

我做错了什么?

安东尼

【问题讨论】:

    标签: asp.net-mvc wcf silverlight


    【解决方案1】:

    是的,您的 WCF 服务是基于 SOAP 的 - 您将无法仅仅浏览到它并查看任何内容。

    如果您想查看服务描述和所有内容,您需要通过

    启用“元数据”交换
    • 在您的服务配置中指定 &lt;serviceMetadata&gt; 行为
    • 在您的服务配置中定义“mex”(元数据交换)端点

    要启用 serviceMetadata,您需要在服务配置中使用此部分(web.config - 部分 &lt;system.serviceModel&gt;):

    <system.serviceModel>
       <behaviors>
       <serviceBehaviors>
           <behavior name="MEXServiceBehavior">
                   <serviceMetadata httpGetEnabled="True"/>
               </behavior>
           </serviceBehaviors>
       </behaviors>
    

    您需要从您的服务中引用它:

    <system.serviceModel>
        <service name="....." behaviorConfiguration="MEXServiceBehavior" ....>
    

    要定义 MEX 端点,请使用以下内容:

    <services>
        <service name="....." behaviorConfiguration="MEXServiceBehavior" ....>
            <endpoint address="http://localhost:5555/YourSerice/mex"
                      binding="mexHttpBinding" contract="IMetadataExchange" />
    

    应该有大量可用的文档向您展示如何执行此操作(包括在 Stackoverflow 上就该主题提出和回答的大量问题)。

    只是一个小小的挑剔:您并没有真正在“在 ASP.NET MVC”中托管您的服务 - 您是在 IIS 中托管它 - MS Web 服务器产品。它完全独立于您使用的是 ASP.NET MVC、ASP.NET webforms 还是其他任何东西。

    马克

    【讨论】:

    • “是的,您的 WCF 服务是基于 SOAP 的 - 您将无法浏览到它并查看任何内容。”这绝对不是真的。您可以创建 WCF 方法以返回将由浏览器显示的 HTML。搜索
    • @ZachSmith: 当你使用 &lt;webHttp&gt; 时,你有一个 REST 服务——而不是一个 SOAP 服务——和 是的 - 你可以“浏览”到 REST 服务 - 我知道,这不是我要说的 - 你不能只是浏览到任何 REST b>SOAP 服务(除了webHttp 绑定......)
    • 啊。我明白了——对不起。为什么你会说 特别创建了一个 REST 服务?虽然我知道它可以通过浏览器请求提供内容,但我不知道这是否特别安静
    【解决方案2】:

    你的 web.config 呢? 你有没有加过这种东西

      <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyFramework.MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceThrottling 
              maxConcurrentCalls="200"
              maxConcurrentSessions="100"
              maxConcurrentInstances="100" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service 
          behaviorConfiguration="MyFramework.MyServiceBehavior"
          name="MyFramework.MyService">
        <endpoint binding="wsHttpBinding"              
                  bindingConfiguration="MyServiceBindingSettings" 
                  contract="MyFramework.IMyService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="MyServiceBindingSettings" 
                 closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" 
                 maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"
                 messageEncoding="Text" textEncoding="utf-8">
          <readerQuotas 
              maxDepth="2147483647" 
              maxStringContentLength="2147483647" 
              maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
              maxNameTableCharCount="2147483647"/>
        </binding>
      </wsHttpBinding>
    </bindings>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2013-02-16
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2012-11-29
      • 2017-01-20
      相关资源
      最近更新 更多