2011-01-13 4 views
3

우리는 매우 크고 복잡한 MVC2 웹 사이트를 가지고 있습니다. 일부 내부 도구 용 API를 추가하고 WCF를 사용하기로 결정했습니다.MVC2 사이트의 호스트 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 : 경우 다른 사람에 내가 전화를 차단 MVC를 방지하기 위해 Global.asax의 경로 설정에 routes.IgnoreRoute("{MyJob}.svc/{*pathInfo}")를 추가했다,이 문제가 있습니다.

+0

여기에 질문을 추가 : http://stackoverflow.com/questions/4683413/wcf-dependency-injection-issue – Basic

+0

와우 1,000 조회 및 2 upvotes? 누구든지 내가 뭘 잘못하고 있는지 말해 줄까? – Basic

답변

10

예는 수 등을 설정 파일에 configuratin을 추가하는 것과 동일하다. 나는 그것을 나의 프로젝트에서 사용하고 행복하다.

WCF 서비스를 프로젝트에 추가하려면 Ctrt + Shift + A 새 항목을 추가하고 "WCF 서비스"를 선택하십시오. 그런 식으로 간단한 WCF 서비스가 추가되고 web.config가 수정됩니다. 예를 들어 "System.ServiceModel.Activation.WebServiceHostFactory"를 사용하기 위해 생성 된 SVC 파일을 수정해야 할 수 있습니다. 로 시작 .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 메서드를 호출하면 WebOperationContext.Current 대신 HttpContext.Current을 사용해야합니다. WebOperationContext.Current == NULL이면 항상 WCF 코드에서 테스트하고 HttpContext.Current을 사용하십시오.

+0

감사합니다. URL 사양이 어떻게 작동하는지 명확히 할 수 있습니까? 예 : MVC app은 http : // MyServer/MyApp에 있습니다. - 내 서비스는 어떤 URL입니까? 'http : // MyServer/MyApp/My.svc'? – Basic

+0

흠, 그래도 작동하는데 문제가 있습니다. 위의 질문에 내 구성을 추가했습니다. 외관을 살펴보고 명백한 결함을 발견 할 수 있습니까? – Basic

+0

@Basiclife : 예. 그렇습니다. 'relativeAddress'의 주소는 상대 주소이므로 http : // MyServer/MyApp'에 응용 프로그램을 게시하면'http : // MyServer/MyApp/My.svc'가 WCF 주소가됩니다 – Oleg

1

예 가능합니다. 필요한 것은 서비스 클래스를 가리키는 ".svc"파일을 추가하고 공장 속성이 사용자 정의 호스트 팩토리로 설정된 것입니다. 이처럼 :

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

다른 일들이

+0

감사합니다.이 파일을'web.config' 옆의 루트에 추가합니까? – Basic

관련 문제