Question

J'ai un service WCF hébergé dans un service Windows. Je l'ai ajouté à 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, problème est que je reçois un http 405 chaque fois que je l'envoie une requête HEAD.

Y at-il un moyen de le faire revenir http 200 également pour la tête? Est-ce même possible?

edit: c'est le contrat d'exploitation:

    [OperationContract]
    [WebGet(UriTemplate = "MyUri")]
    Stream MyContract();
Était-ce utile?

La solution

[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 très bien. Je reçois un 405 (Méthode non autorisée) sur demande HEAD. La version de montage J'utilise est System.ServiceModel.Web, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35.

En fait, pour autant que je sache, il n'y a pas aller de l'avant droit de permettre it.However vous pouvez essayer quelque chose comme la solution below..But cela doit être fait pour chaque méthode qui a besoin GET et HEAD, ce qui en fait un pas solution si é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
}

Autres conseils

On dirait un bug grave dans le service (ou même le cadre). Prise en charge de HEAD HTTP / 1.1 est en aucun cas en option.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top