ChannelFactory с WebHttpBinding всегда POST при выполнении ServiceContract OperationContract - PullRequest
0 голосов
/ 28 марта 2012

У меня есть служба, которая размещается через 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 Ответ

0 голосов
/ 11 апреля 2012
...