2013-01-03 4 views
2

J'ai besoin de créer un service WCF qui se trouve sur un serveur (hébergé dans IIS) et qui écoute toutes les demandes HTTP GET qui arrivent sur le serveur à une certaine URL.Service WCF pour gérer les requêtes HTTP GET

Plus précisément lorsqu'une requête GET valide frappe le serveur, Id aime inspecter les paramètres codés dans l'URL.

Voici le code de mon interface:

[ServiceContract] 
public interface IHttpHandler 
{ 
    [OperationContract(Action = "*", ReplyAction = "*")] 
    void HandleMessage(Message m); 

    [OperationContract] 
    [WebInvoke(UriTemplate = "HandleEchoRequest", Method = "GET")] 
    string HandleEchoRequest(Stream request); 
} 

code d'implémentation (fichier svc.cs):

public void HandleMessage(Message m) 
{ 
    //do some work 
} 

public string HandleEchoRequest(Stream request) 
{ 
    //...do something here 
    return "asdf"; 
} 

Je peux frapper avec succès le SVC:

http://localhost/HttpMessageProcessor/HttpHandler.svc 

Cependant, je ne peux pas sembler entrer dans le jeu de point de rupture lorsqu'il est attaché au processus W3WP. En fin de compte, j'aime utiliser HTTPS.

Mon fichier web.config dans le projet de service WCF:

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

App.config dans le client:

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webBehavior"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IHttpHandler" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/HttpMessageProcessor/HttpHandler.svc" 
     behaviorConfiguration="webBehavior" binding="webHttpBinding" 
     contract="Proxy.IHttpHandler" name="BasicHttpBinding_IHttpHandler" /> 
    </client> 
    </system.serviceModel> 

Code client:

using (var service = new Proxy.HttpHandlerClient()) 
{ 
} 

Console.ReadKey(); 

J'ai essayé deux choses pour voir si je peux entrer dans le code: 1. Appuyez sur CTRL + F5 sur le projet de la console pour démarrer le client, puis voir si je peux attacher au processus W3WP. 2. Exécutez le client en mode débogage et voir si je peux pointer vers une URL telle que:

http://localhost/HttpMessageProcessor/HttpHandler.svc/HandleEchoRequest/ 

Aucune des méthodes ci-dessus semblent fonctionner. J'ai déjà jeté un coup d'oeil autour du filet pour des suggestions et ai essayé quelques choses et je me suis reposé sur le code que j'ai mentionné ici. Toutes les suggestions/idées sont les bienvenues!

EDIT je suis tombé sur le site web this et mis en œuvre une solution simple comme suit. Je peux frapper avec succès le point d'arrêt défini dans la mise en œuvre de HandleMessage lorsque je saisis l'URL suivante dans le navigateur:

http://localhost/TestWCFSite/TestWCFService.svc/HandleMessage 

code:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract(Action = "*", ReplyAction = "*")] 
    void HandleMessage(Message m); 
} 

public class Service1 : IService1 
{ 
    public void HandleMessage(Message m) 
    { 
     //do something here. 
    } 
} 

App.config pour le service:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="False"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Mon code client:

Uri baseAddress = new Uri("http://localhost/TestWCFSite/TestWCFService.svc/"); 
Uri endpointAddress = new Uri("http://localhost/TestWCFSite/TestWCFService.svc/HandleMessage/"); 
var binding = new CustomBinding(new TextMessageEncodingBindingElement(MessageVersion.None, Encoding.UTF8), new HttpTransportBindingElement()); 
ServiceHost service = new ServiceHost(typeof(Service1), baseAddress); 
service.AddServiceEndpoint(typeof(IService1), binding, endpointAddress); 
service.Open(); 

var message = string.Format("Service open at {0} - press a key to continue", baseAddress); 

Console.WriteLine(message); 
Console.ReadKey(); 
service.Close(); 

Mon problème essaie maintenant d'héberger ceci dans IIS et de l'obtenir pour traiter le coup de breakpoint.

Répondre

0

En supposant que vous utilisez Visual Studio, que se passe-t-il si vous vous connectez via Outils-> Attacher au processus ...?Pour vérifier, je suppose que vous vous joignez au projet de service WCF plutôt qu'au projet client. (Toutes mes excuses pour avoir répondu à cette question, mon représentant est trop faible pour faire des commentaires.)

+0

Hey, yup - en utilisant Visual Studio. J'ai le client et le service WCF dans la même solution. Quand je l'attache, il est dit que le code client ne sera pas utilisé. Le code WCF est rouge vif ce qui signifie qu'il devrait frapper ... – TheRenoRanger

Questions connexes