0

WebServiceHost を介してホストされているサービスがあり、一部の呼び出しを Web 上の他の REST サービスに委任する必要があります。

これを処理するために ClientBase 具象クラスを作成しました。フローは次のようになります。

http://localhost:8000/users/my@email.com -> My WebServiceHost インスタンス -> ClientBase -> REST サービス

ClientBase からのすべての呼び出しが動詞として POST を使用していることに気付くまで、すべてがうまく機能していました。ClientBase でばかげたことをしていないことを確認するために、ChannelFactory を手動で作成し、それを使用しました。残念ながら、ClientBase、ChannelFactory、さらには ServiceContract の装飾に関係なく、すべての呼び出しで POST が使用されていました。

次に、コードの分離を開始し、WebServiceHost が処理していた要求内から元の呼び出しが来ていないときに、単純な ChannelFactory が機能することに気付きました。

これは正確な問題を示す抽出された Program.cs です。Program.Main からの MakeGetCall() は意図したとおりに機能しますが、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";
    }
}
4

1 に答える 1

0

このあたりの作品を見つけました:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/03a2b109-c400-49d4-891e-03871ae0d083/

于 2012-04-11T18:42:43.443 に答える