2009-09-07 5 views
3

У меня есть служба WCF, размещенная в службе Windows. Я добавил к нему webHttpBinding с поведением webHttp, и всякий раз, когда я отправляю ему запрос GET, я получаю http 200, что я хочу, проблема в том, что я получаю http 405 всякий раз, когда я отправляю ему запрос HEAD.Как сделать поведение WCF webHttp приемлемым для глаголов HEAD?

Есть ли способ, чтобы он возвращал http 200 для HEAD? Возможно ли это?

редактировать: это договор операции:

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

вы можете разместить операции контракт на глагол ГОЛОВЫ пожалуйста? –

+0

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

+3

Неужели это проблема более 3 лет спустя? Мне нужно решение. –

ответ

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(); 

    } 
} 

Приведенный выше код работает нормально. Я получаю 405 (метод не разрешен) по запросу HEAD. Версия сборки, которую я использую, - 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 
} 
+0

Я предполагаю, что мой заголовок вводит в заблуждение, я хочу получить 200 для запроса HEAD, а также для GET. –

+1

Да, Прашант отлично поработал здесь, объясняя варианты. Но этот вопрос в НЕТ ПУТЬ решен. Нет причин, по которым вы не сможете заставить HEAD работать с веб-сервисом (это STANDARD-глагол). Думаю, я продолжу копать, чтобы заставить WCF правильно реагировать на запросы HEAD. –

1

Похоже серьезная ошибка в службы (или даже в рамках). Поддержка HEAD в HTTP/1.1 не является необязательной.