0

У меня есть служба, которая размещается через WebServiceHost, и мне нужно делегировать некоторые вызовы другим службам REST в Интернете.ChannelFactory с WebHttpBinding всегда POST при выполнении ServiceContract OperationContract

Для этого я создал конкретный класс ClientBase. Поток выглядит следующим образом:

http://localhost:8000/users/[email protected] -> Мой WebServiceHost экземпляр -> ClientBase -> Сервис REST

Все работает хорошо, пока я не понял, что все вызовы, поступающие из ClientBase использовали POST в качестве глагола. Чтобы убедиться, что я не делал ничего глупо с ClientBase, я создал ChannelFactory вручную и использовал это. Не повезло, каждый звонок по-прежнему использовался POST независимо от ClientBase, ChannelFactory и даже украшений ServiceContract.

Затем я начал изолировать код и понял, что мой простой ChannelFactory работал, когда первоначальный вызов не поступал из запроса, который обрабатывал мой WebServiceHost.

Вот дистиллированная Program.cs, который показывает точную проблему, MakeGetCall() из Program.Main работает, как задумано, но вызов от MyService.GetUser всегда POST:

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Program.MakeGetCall(); //This works as intended even when changing the WebInvoke attribute parameters 

     WebServiceHost webServiceHost = new WebServiceHost(typeof(MyService), new Uri("http://localhost:8000/")); 

     ServiceEndpoint serviceEndpoint = webServiceHost.AddServiceEndpoint(typeof(IMyServiceContract), new WebHttpBinding(), ""); 

     webServiceHost.Open(); 

     Console.ReadLine(); 
    } 

    public static void MakeGetCall() 
    { 
     ServiceEndpoint endpoint = new ServiceEndpoint(
      ContractDescription.GetContract(typeof(IMyServiceContract)), 
      new WebHttpBinding(), 
      new EndpointAddress("http://posttestserver.com/post.php")); 

     endpoint.Behaviors.Add(new WebHttpBehavior()); 

     ChannelFactory<IMyServiceContract> cf = new ChannelFactory<IMyServiceContract>(endpoint); 

     IMyServiceContract test = cf.CreateChannel(); 

     test.GetUser("test"); 
    } 

} 

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "https://stackoverflow.com/users/{emailAddress}")] 
    string GetUser(string emailAddress); 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetUser(string emailAddress) 
    { 
     Program.MakeGetCall(); //This will ALWAYS POST no matter if you are using [WebInvoke(Method="GET")] or even [WebGet] 

     return "foo"; 
    } 
} 

ответ