我在Windows服务中托管了WCF服务。 我已经添加了一个带有webHttp行为的webHttpBinding,每当我发送一个GET请求时,我得到了http 200这就是我想要的,问题是每当我发送一个HEAD请求时我都会得到一个http 405。
有没有办法让它还能为HEAD返回http 200? 这甚至可能吗?
编辑:这是操作合同:
[OperationContract]
[WebGet(UriTemplate = "MyUri")]
Stream MyContract();
答案 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绝不是可选的。