ChannelFactory с WebHttpBinding всегда POST при выполнении ServiceContract OperationContract

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

Я создал конкретный класс ClientBase, чтобы справиться с этим. Поток выглядит так:

http://localhost:8000/users/my@email.com -> Мой экземпляр 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 = "/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";
    }
}

1 ответ

Решение
Другие вопросы по тегам