【问题标题】:Is WebGet functionally equivalent to WebInvoke(Method = "GET")?WebGet 在功能上是否等同于 WebInvoke(Method = "GET")?
【发布时间】:2015-02-27 16:31:26
【问题描述】:

This 问题已经问到我在问什么,但我想澄清一下答案。

答案指出WebGetWebInvoke 相似,主要区别在于Method 参数。

但是如果Method参数设置为"GET",它实际上在功能上是等效的,还是有其他区别?

【问题讨论】:

  • WebInvoke 的文档说:“如果您希望服务操作响应 GET,请改用 WebGetAttribute。”因此,WebInvoke 似乎只适用于 POST、PUT 或 DELETE。
  • 一个区别:内部System.Data.Services.Providers.BaseServiceProvider.AddOperationsFromType 方法将WebGet 视为GET 而WebInvoke(即使它的方法是GET)视为POST。
  • @MichaelLiu 是的,我读到了,但是代码已经包含WebInvoke(Method="GET"),所以我想确保在更改之前我没有破坏任何东西

标签: c# .net wcf webinvoke webget


【解决方案1】:

不是。

我花了几个小时尝试使用基于 this 的 MessageFormatter 将 WCF DataContractJsonSerializer 替换为 Newtonsoft JsonSerializer 和 this样本

发现(很难)使用WebGetWebInvoke(Method="GET") 是有区别的。

WebInvoke 的请求通过 WCF 堆栈中的不同管道,试图反序列化预期的消息(方法 IDispatchMessageFormatter.DeserializeRequest() 被调用),而 WebGet 的情况并非如此。

经验教训:使用WebGet 进行GET 操作

【讨论】:

    【解决方案2】:

    它们只是标记属性,最终在功能上是 100% 等效的。唯一解释这些属性的是WebHttpBehavior::GetWebMethod 方法,它的功能很简单:

    internal static string GetWebMethod(OperationDescription od)
    {
        WebGetAttribute webGetAttribute = od.Behaviors.Find<WebGetAttribute>();
        WebInvokeAttribute webInvokeAttribute = od.Behaviors.Find<WebInvokeAttribute>();
        WebHttpBehavior.EnsureOk(webGetAttribute, webInvokeAttribute, od);
        if (webGetAttribute != null)
        {
            return "GET";
        }
        if (webInvokeAttribute == null)
        {
            return "POST";
        }
        return webInvokeAttribute.Method ?? "POST";
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 2011-09-02
      • 2011-02-13
      相关资源
      最近更新 更多