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

5
我有一个托管在Windows服务中的WCF服务。 我已经添加了一个webHttpBinding和一个webHttp行为,并且每当我发送一个GET请求时,我会得到http 200的响应,这正是我想要的,但问题是每当我发送一个HEAD请求时,我会得到http 405的响应。
是否有办法使它也对HEAD请求返回http 200呢? 这是否可能?
编辑:这是操作协定:
    [OperationContract]
    [WebGet(UriTemplate = "MyUri")]
    Stream MyContract();

请问您能发布 HEAD 方法的操作契约吗? - Preet Sangha
[OperationContract] [WebGet(UriTemplate = "MyUri")] Stream MyContract(); [OperationContract] [WebGet(UriTemplate = "MyUri")] Stream MyContract(); - Meidan Alon
3
这个问题三年后还存在吗?我需要一个解决方案。 - Ross Hambrick
2个回答

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(方法不允许)的错误。我使用的程序集版本是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();
}

公共类Service : 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
}

我想我的标题有误导性,我想要在HEAD请求和GET请求中都得到一个200的响应。 - Meidan Alon
1
是的,Prashanth在这里做了一个很好的工作,解释了选项。但是这个问题绝对没有解决。你应该能够让HEAD与webservice一起工作(这是一个标准动词),没有任何理由不行。我猜我会继续挖掘如何让WCF正确响应HEAD请求的方法。 - Michael K. Campbell

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接