Asp.net mvc MVC2站点中的主机WCF

Asp.net mvc MVC2站点中的主机WCF,asp.net-mvc,wcf,web-services,asp.net-mvc-2,Asp.net Mvc,Wcf,Web Services,Asp.net Mvc 2,我们有一个非常大、复杂的MVC2网站。我们想为一些内部工具添加一个API,并决定使用WCF 理想情况下,我们希望MVC本身承载WCF服务。原因包括: 虽然应用程序有多个层次,但我们希望API中的某些功能需要网站本身(例如格式化电子邮件) 我们使用TFS自动构建(持续集成)和部署—我们需要修改构建和发布机制的次数越少越好 我们在整个应用程序中使用Unity容器和控制反转。作为网站的一部分,我们可以重用配置类和其他帮助器方法 我已经编写了一个自定义ServiceBehavior,它又有一个自定义

我们有一个非常大、复杂的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正在运行。我是否需要对我的路线做些什么


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

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

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


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

是的,这是可能的。我在我的项目中使用它并感到快乐

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

<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
。如果
WebOperationContext.Current==NULL
,我总是在WCF代码中进行测试,然后使用
HttpContext.Current

谢谢-我是否将此文件添加到
web.config
旁边的根目录下?谢谢。您能否澄清URL规范是如何工作的?例如,我的MVC应用程序位于
http://MyServer/MyApp
-我的服务将位于哪个URL<代码>http://MyServer/MyApp/My.svc?嗯,我还是有问题要解决-我已经在上面的问题中添加了我的配置,你能看一看,看看你是否能发现任何明显的缺陷吗?@Basiclife:是的。
relativeAddress
中的地址是相对的,因此如果您在
http://MyServer/MyApp
,然后
http://MyServer/MyApp/My.svc
将是WCFaddress@Basiclife:我使用
webHttpEndpoint
。在
的内部,我有
。在
下,我有
好的,谢谢-我仍然有问题,但至少它们是不同的问题:)至少我现在可以得到一个
mex
,这样我知道服务存在。如果其他人遇到这种情况,我必须将
routes.IgnoreRoute(“{MyJob}.svc/{*pathInfo}”)
添加到
Global.asax
中的路由设置中,以防止MVC截取调用这里的后续问题:哇1000次视图和2次投票?有人愿意告诉我我做错了什么吗?