MVC2站点中的主机WCF

时间:2011-01-13 12:43:54

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

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

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

  • 虽然应用程序有多层,但我们在API中需要的一些功能需要网站本身(例如格式化电子邮件)。
  • 我们使用TFS自动构建(持续集成)和部署 - 我们需要的修改构建和发布机制越少越好
  • 我们在整个应用程序中使用Unity容器和Inversion of Control。成为网站的一部分将允许我们重用配置类和其他帮助方法。

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

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

我以前只有服务/标准Asp.Net网站的经验,并且没有意识到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正在运行。我可能需要对我的路线做些什么吗?

NB:如果其他人遇到此问题,我必须将routes.IgnoreRoute("{MyJob}.svc/{*pathInfo}")添加到Global.asax中的路由设置中,以防止MVC拦截该呼叫。

2 个答案:

答案 0 :(得分:10)

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

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

<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

答案 1 :(得分:1)

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

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

其他方面是相同的,例如在配置文件中添加配置等。