【问题标题】:Host WCF in MVC2 Site在 MVC2 站点中托管 WCF
【发布时间】:2011-01-13 12:43:54
【问题描述】:

我们有一个非常庞大、复杂的 MVC2 网站。我们想为一些内部工具添加 API,并决定使用 WCF。

理想情况下,我们希望 MVC 本身托管 WCF 服务。原因包括:

  • 尽管应用程序有多个层次,但我们希望 API 中的某些功能需要网站本身(例如格式化电子邮件)。
  • 我们使用 TFS 自动构建(持续集成)和部署 - 我们需要修改构建和发布机制的次数越少越好
  • 我们在整个应用程序中使用 Unity 容器和控制反转。作为网站的一部分,我们可以重用配置类和其他辅助方法。

我编写了一个自定义的 ServiceBehavior,它又具有一个自定义的 InstanceProvider - 这允许我实例化和配置一个容器,然后用于为来自 WCF 的类实例的所有请求提供服务。

所以我的问题是;是否可以从 MVC 本身托管 WCF 服务?

我之前只在服务/标准 Asp.Net 网站方面有过经验,直到我真正尝试将 MVC2 连接到配置中并且什么都没发生之前,我才意识到 MVC2 可能会有所不同。经过一番谷歌搜索,似乎没有很多关于这样做的参考 - 所以我想在这里问一下。

更多详情:

感谢那些回复的人,但我仍然无法正常工作...我当前的配置如下所示:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"
                               aspNetCompatibilityEnabled="true">
        <serviceActivations>
            <add relativeAddress="Job.svc"
                 service="MyApplication.WebJobManager"
                 factory="System.ServiceModel.Activation.WebServiceHostFactory" />
        </serviceActivations>
    </serviceHostingEnvironment>
    <extensions>
        <behaviorExtensions>
            <add name="WCFDIBehavior" type="MyApplication.Jobs.WCFDIBehaviorExtension, MyApplication.Jobs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
    </extensions>
    <standardEndpoints>
        <mexEndpoint>
            <standardEndpoint name="WebJobManagerMex" />
        </mexEndpoint>
    </standardEndpoints>
    <behaviors>
        <serviceBehaviors>
            <behavior name="JobServiceBehavior">
                <serviceMetadata />
                <WCFDIBehavior />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="" name="MyApplication.Jobs.WebJobManager">
            <endpoint binding="basicHttpBinding"
              bindingConfiguration="" name="HTTPEndpoint" contract="MyApplication.JobService.Interfaces.IWebJobManager" />
        </service>
    </services>
</system.serviceModel>

如果有什么明显错误的地方,有人可以告诉我吗?

我期待在http://localhost/MyApplication/Job.svc 找到端点,在http://localhost/MyApplication/Job.svc?mex 找到元数据,但是,两者都给出 404 - 据我所知,没有明显迹象表明 WCF 正在运行。我可能需要对我的路线做些什么吗?

注意:如果其他人有这个问题,我必须在Global.asax 的路由设置中添加routes.IgnoreRoute("{MyJob}.svc/{*pathInfo}"),以防止MVC 拦截调用。

【问题讨论】:

标签: asp.net-mvc wcf web-services asp.net-mvc-2


【解决方案1】:

是的,这是可能的。我在我的项目中使用它并且很开心。

要将 WCF 服务添加到您的项目中,您需要添加新项目 Ctrt+Shift+A 并选择“WCF 服务”。将添加简单的 WCF 服务并修改 web.config 的方式。可能需要修改创建的 SVC 文件,例如使用“System.ServiceModel.Activation.WebServiceHostFactory”。从 .NET 4.0 开始,您可以删除 SVC 文件并改用具有相同信息的 &lt;serviceActivation&gt;。例如,

<serviceHostingEnvironment multipleSiteBindingsEnabled="true"
                           aspNetCompatibilityEnabled="true">
    <serviceActivations>
        <add relativeAddress="My.svc"
             service="MyNamespace.MyClass"
             factory="System.ServiceModel.Activation.WebServiceHostFactory" />
    </serviceActivations>
</serviceHostingEnvironment>

一个小评论。如果您从 MVC 内部调用某些 WCF 方法,则需要使用 HttpContext.Current 而不是 WebOperationContext.Current。我总是在 WCF 代码中测试WebOperationContext.Current == NULL,然后使用HttpContext.Current

【讨论】:

  • 谢谢。你能澄清一下 URL 规范是如何工作的吗?例如,我的 MVC 应用程序位于 http://MyServer/MyApp - 我的服务位于哪个 URL? http://MyServer/MyApp/My.svc ?
  • 嗯,我仍然无法让它工作 - 我已将我的配置添加到上面的问题中,请您看看是否可以发现任何明显的缺陷?
  • @Basiclife:没错。 relativeAddress中的地址是相对的,所以如果你在http://MyServer/MyApp中发布你的应用,那么http://MyServer/MyApp/My.svc就是WCF地址
  • @Basiclife:我使用webHttpEndpoint。在&lt;standardEndpoints&gt; 里面我有&lt;webHttpEndpoint&gt;&lt;standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" /&gt;&lt;/webHttpEndpoint&gt;。在&lt;serviceBehaviors&gt; 下我有&lt;behavior name=""&gt;&lt;serviceMetadata httpGetEnabled="true" /&gt;&lt;serviceDebug includeExceptionDetailInFaults="false" /&gt;&lt;/behavior&gt;
  • 好的,谢谢 - 我仍然有问题,但至少它们是 不同 问题 :) 至少我现在可以获得mex 所以我知道该服务存在。万一其他人遇到这种情况,我必须将routes.IgnoreRoute("{MyJob}.svc/{*pathInfo}") 添加到Global.asax 的路由设置中,以防止MVC 拦截调用
【解决方案2】:

是的,这是可能的。您唯一需要做的就是添加指向您服务类的“.svc”文件,并将工厂属性设置为您的自定义主机工厂。像这样:

<%@ServiceHost language="c#" Debug="true" 
    Service="Services.Implementations.UserValidator"
    Factory="Services.Factories.CustomServiceHostFactory"  %>

其他的都是一样的,比如添加configuratin到配置文件等

【讨论】:

  • 谢谢 - 我是否将此文件添加到 web.config 旁边的根目录中?
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2011-06-21
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多