【问题标题】:how to make WCF webHttp behaviour accept HEAD verbs?如何使 WCF webHttp 行为接受 HEAD 动词?
【发布时间】:2010-11-26 03:41:01
【问题描述】:

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

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

编辑:这就是运营合同:

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

【问题讨论】:

  • 你能把 HEAD 动词的操作合同贴出来吗?
  • [OperationContract] [WebGet(UriTemplate = "MyUri")] Stream MyContract();
  • 3年多后这还是个问题吗?我需要一个解决方案。

标签: wcf http webhttpbinding webhttp


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    [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();
    }
    

    公共类服务: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。
    • 是的,Prashanth 在解释选项方面做得很好。但是这个问题是没有办法解决的。没有理由不能让 HEAD 与 Web 服务一起工作(这是一个标准动词)。我想我会继续寻找让 WCF 正确响应 HEAD 请求的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2011-12-29
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多