如何让WCF webHttp行为接受HEAD动词?

时间:2009-09-07 07:07:05

标签: wcf http webhttpbinding webhttp

我在Windows服务中托管了WCF服务。 我已经添加了一个带有webHttp行为的webHttpBinding,每当我发送一个GET请求时,我得到了http 200这就是我想要的,问题是每当我发送一个HEAD请求时我都会得到一个http 405。

有没有办法让它还能为HEAD返回http 200? 这甚至可能吗?

编辑:这是操作合同:

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

2 个答案:

答案 0 :(得分: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();

    }
}

上面的代码工作正常。我在HEAD请求上得到405(Method not allowed)。我使用的程序集版本是System.ServiceModel.Web,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35。

实际上据我所知,没有直接允许它的方式。但是你可以尝试类似下面的解决方案。但是必须为每个需要GET和HEAD的方法做这个,这使得它不是如此优雅的解决方案..

[ServiceContract]
public interface IService
{
    [OperationContract]

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

公共类服务:IService     {         #region IService会员

    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
}

答案 1 :(得分:1)

听起来像服务(甚至框架)中的严重错误。在HTTP / 1.1中支持HEAD绝不是可选的。