2011-01-13 6 views
3

Wir haben eine sehr große, komplexe MVC2-Website. Wir möchten eine API für einige interne Tools hinzufügen und entschieden uns für WCF.Host-WCF in MVC2-Site

Idealerweise möchten wir, dass MVC selbst den WCF-Dienst hostet. Gründe dafür sind:

  • Obwohl es mehrere Ebenen für die Anwendung gibt, benötigen einige Funktionen, die wir in der API möchten, die Website selbst (z. B. Formatieren von E-Mails).
  • Wir verwenden TFS für die automatische Erstellung (kontinuierliche Integration) und Bereitstellung - Je weniger wir den Build- und Release-Mechanismus ändern müssen, desto besser
  • Wir verwenden den Unity-Container und Inversion der Steuerung in der gesamten Anwendung. Als Teil der Website können wir Konfigurationsklassen und andere Hilfsmethoden wiederverwenden.
  • Ich habe ein benutzerdefiniertes ServiceBehavior geschrieben, das wiederum einen benutzerdefinierten InstanceProvider enthält. Dadurch kann ich einen Container instanziieren und konfigurieren, der dann verwendet wird, um alle Anforderungen für Klasseninstanzen von WCF zu bearbeiten.

    Also meine Frage ist; Ist es möglich, einen WCF-Service innerhalb von MVC selbst zu hosten?

    Ich hatte nur Erfahrung in Services/Standard Asp.Net Websites vor und nicht realisiert, MVC2 könnte anders sein, bis ich tatsächlich versucht, es in die Konfig und nichts passiert. Nach etwas Googeln scheint es nicht viele Hinweise darauf zu geben - also dachte ich, ich würde hier fragen.

    Mehr Detail:

    Dank diejenigen, die geantwortet, aber ich bin immer dies immer noch Probleme mit zu arbeiten ... Meine aktuelle Konfiguration sieht wie folgt aus: jemand

    <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> 
    

    Can Bitte sag mir, wenn etwas offensichtlich falsch aussieht?

    Ich habe erwartet, den Endpunkt bei http://localhost/MyApplication/Job.svc und Metadaten bei http://localhost/MyApplication/Job.svc?mex zu finden, aber beide geben eine 404 - So weit ich sagen kann, gibt es kein offensichtliches Zeichen, dass WCF überhaupt läuft. Muss ich vielleicht etwas auf meinen Routen machen?

    NB: Falls andere haben dieses Problem, ich routes.IgnoreRoute("{MyJob}.svc/{*pathInfo}") zum Route-Setup in Global.asax hinzufügen hatte MVC zu verhindern, dass der Anruf abfängt.

    +0

    Folgefrage hier: http://stackoverflow.com/questions/4683413/wcf-dependency-injection-issue – Basic

    +0

    Wow 1.000 Aufrufe und 2 Upvotes? Möchte mir jemand sagen, was ich falsch mache? – Basic

    Antwort

    10

    Ja, es ist möglich. Ich benutze es in meinen Projekten und bin glücklich.

    Um WCF Service zu Ihrem Projekt hinzuzufügen, müssen Sie einen neuen Artikel Ctrt + Shift + A hinzufügen und "WCF Service" wählen. So wie der einfache WCF-Dienst hinzugefügt und die web.config geändert wird. Es kann erforderlich sein, um eine erstellte SVC-Datei zu ändern, um beispielsweise "System.ServiceModel.Activation.WebServiceHostFactory" zu verwenden. Beginnen mit .NET 4.0 können Sie die SVC-Datei löschen und stattdessen <serviceActivation> mit denselben Informationen verwenden. Zum Beispiel

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

    Eine kleine Bemerkung. Wenn Sie einige WCF-Methoden intern vom MVC aufrufen, müssen Sie HttpContext.Current anstelle von WebOperationContext.Current verwenden. Ich teste immer im WCF-Code, wenn WebOperationContext.Current == NULL, dann HttpContext.Current verwenden.

    +0

    Danke. Können Sie erläutern, wie die URL-Spezifikation funktioniert? zB Meine MVC-App lebt unter "http: // MyServer/MyApp" - Welche URL würde mein Dienst haben? "http: // MeinServer/MyApp/My.svc"? – Basic

    +0

    Hmm I ', immer noch Probleme damit, dies zum Laufen zu bringen - Ich habe meine Konfiguration zu der obigen Frage hinzugefügt, können Sie bitte einen Blick darauf werfen und sehen, ob Sie irgendwelche offensichtlichen Fehler entdecken können? – Basic

    +0

    @Basiclife: Ja genau. Die Adresse in 'relativeAddress' ist relativ. Wenn Sie also Ihre Anwendung in' http: // MyServer/MyApp' veröffentlichen, ist 'http: // MyServer/MyApp/My.svc' die WCF-Adresse – Oleg

    1

    Ja, es ist möglich. Sie müssen lediglich die Datei ".svc" hinzufügen, die auf Ihre Serviceklasse verweist und die Factory-Eigenschaft auf Ihre benutzerdefinierte Host-Factory festgelegt hat. Wie folgt aus:

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

    Andere Dinge sind die gleichen, wie das Hinzufügen von configuratin zu Konfigurationsdatei usw.

    +0

    Danke - füge ich diese Datei zum Root neben 'web.config' hinzu? – Basic