2009-09-07 9 views
3

J'ai un service WCF hébergé dans un service Windows. J'ai ajouté à cela un webHttpBinding avec un comportement webHttp et chaque fois que je l'envoie une requête GET je reçois http 200 qui est ce que je veux, le problème est que je reçois un http 405 chaque fois que j'envoie une requête HEAD.comment rendre le comportement WCF webHttp accepter les verbes HEAD?

Existe-t-il un moyen de le faire retourner http 200 aussi pour HEAD? Est-ce encore possible?

edit: qui est le contrat d'exploitation:

[OperationContract] 
    [WebGet(UriTemplate = "MyUri")] 
    Stream MyContract(); 
+0

Pouvez-vous poster le contrat d'exploitation pour le verbe HEAD s'il vous plaît? –

+0

[OperationContract] [WebGet (UriTemplate = "MyUri")] Stream MyContract(); –

+3

Est-ce encore un problème plus de 3 ans plus tard? J'ai besoin d'une solution à cela. –

Répondre

3
[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate="/data")] 
    string GetData(); 
} 

public class Service : IService 
{ 
    #region IService Members 

    public string GetData() 
    { 
     return "Hello"; 

    } 

    #endregion 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     WebHttpBinding binding = new WebHttpBinding(); 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:9876/MyService")); 
     host.AddServiceEndpoint(typeof(IService), binding, "http://localhost:9876/MyService"); 
     host.Open(); 
     Console.Read(); 

    } 
} 

Le code ci-dessus fonctionne correctement. Je reçois un 405 (méthode non autorisée) sur demande HEAD. La version de l'assembly que j'utilise est System.ServiceModel.Web, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35.

En fait, autant que je sache, il n'y a pas de moyen simple de l'autoriser. Cependant, vous pouvez essayer quelque chose comme la solution ci-dessous..Mais cela doit être fait pour chaque méthode qui nécessite GET et HEAD. pas si solution élégante ..

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 

    [WebInvoke(Method = "*", UriTemplate = "/data")]   
    string GetData(); 
} 

service public class: IService { #region IService Membres

public string GetData() 
    { 
     HttpRequestMessageProperty request = 
      System.ServiceModel.OperationContext.Current.IncomingMessageProperties["httpRequest"] as HttpRequestMessageProperty; 

     if (request != null) 
     { 
      if (request.Method != "GET" || request.Method != "HEAD") 
      { 
       //Return a 405 here. 
      } 
     } 

     return "Hello"; 

    } 

    #endregion 
} 
+0

Je suppose que mon titre était trompeur, je veux obtenir un 200 pour une demande HEAD ainsi que pour un GET. –

+1

Yeah Prashanth a fait un excellent travail ici pour expliquer les options. Mais cette question n'est EN AUCUN CAS résolue. Il n'y a AUCUNE raison pour laquelle vous ne devriez pas pouvoir obtenir un HEAD pour travailler avec un service web (c'est un verbe STANDARD). Je suppose que je vais continuer à creuser pour que la WCF réponde correctement aux requêtes HEAD. –

1

Sons comme un bogue sérieux dans le service (ou même le cadre). La prise en charge de HEAD dans HTTP/1.1 n'est en aucun cas facultative.

Questions connexes