2

[WebGet]「GET」経由でアクセスするには、すべての操作の上に属性を記述する必要がありますか? デフォルトの ACCESS METHOD を「POST」ではなく「GET」にしたいと考えています。web.config/app.config でそれを行う方法はありますか?

4

1 に答える 1

1

設定だけではどうしようもありません。から派生した新しい動作を作成しWebHttpBehavior、デフォルトを変更する必要があります (何もない場合は [WebGet] を追加します) - 以下のコードを参照してください。次に、必要に応じて、構成を介してその動作を使用する動作構成拡張を定義できます。

public class StackOverflow_10970052
{
    [ServiceContract]
    public class Service
    {
        [OperationContract]
        public int Add(int x, int y)
        {
            return x + y;
        }
        [OperationContract]
        public int Subtract(int x, int y)
        {
            return x + y;
        }
        [OperationContract, WebInvoke]
        public string Echo(string input)
        {
            return input;
        }
    }
    public class MyGetDefaultWebHttpBehavior : WebHttpBehavior
    {
        public override void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                if (operation.Behaviors.Find<WebGetAttribute>() == null && operation.Behaviors.Find<WebInvokeAttribute>() == null)
                {
                    operation.Behaviors.Add(new WebGetAttribute());
                }
            }

            base.ApplyDispatchBehavior(endpoint, endpointDispatcher);
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(Service), new WebHttpBinding(), "").Behaviors.Add(new MyGetDefaultWebHttpBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        WebClient c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/Add?x=6&y=8"));

        c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/Subtract?x=6&y=8"));

        c = new WebClient();
        c.Headers[HttpRequestHeader.ContentType] = "application/json";
        Console.WriteLine(c.UploadString(baseAddress + "/Echo", "\"hello world\""));

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
于 2012-06-11T19:34:14.793 に答える