【问题标题】:WCF Service Failing With Method Not AllowedWCF 服务因不允许的方法而失败
【发布时间】:2012-01-11 02:27:28
【问题描述】:

我有一个 JSON WCF 服务,并且我编写了一些 javascript 来访问这样的服务,

function stuffClick2() {
        $.ajax({
            url: "http://192.168.54.98/JsonWCFService/Service1.svc/Post",
            type: "POST",
            contentType: "application/json",
            data: '{"x":"1","y":"2","message":"The answer is: "}',
            dataType: "html",
            success: function(data) { $('body').html(data); }     
        });
    }

我编写了一个 HTML 页面,其中包含上述 javascript。 HTML 页面是使用 IIS 提供的。

当我在 PC 上使用 chrome 访问 HTML 页面时,我看到这些操作按此顺序发送到 WCF JSON 服务,

OPTIONS /JsonWCFService/Service1.svc/Post HTTP/1.1
POST /JsonWCFService/Service1.svc/Post HTTP/1.1

之前的 OPTIONS 失败了,但是我让 OPTIONS 调用返回了这个头,然后让它工作,

Access-Control-Allow-Origin: *

但是我上面定义的回调不起作用,

success: function(data) { $('body').html(data); } 

我知道 WCF 服务返回了类似的内容,

<b> The answer is 3 </b>

但是当回调被调用时,数据的值是一个空字符串。

当我在不同的浏览器 (IE) 中运行 html 页面时,它只会导致 POST 调用,而不是 OPTIONS 调用,那么它就可以工作。我注意到 IE 警告我它存在安全风险并询问我是否要继续。

【问题讨论】:

    标签: jquery wcf


    【解决方案1】:

    当我尝试使用 WCF 为我正在制作的移动 HTML 应用程序实现 CORS 时遇到了这个问题。 OPTIONS 是一个预检请求,用于在调用方法之前查看方法是否可用。

    这将是您的问题:

    1. OPTIONS 我认为默认情况下由 IIS 关闭。可能的起点在这里:http://www-jo.se/f.pfleger/cors-and-iis
    2. OPTIONS 动词将使其成为您实际的 POST 方法,因此您将希望在 WCF 过滤器 OPTIONS 中为另一个具有相同返回类型但不执行任何操作的方法提供一些内容。并将 POST 动词过滤为您的实际方法。如果你不这样做,你会发现要么你的方法被调用了两次,要么它会抛出一个 webservice 模糊异常的奇怪行为。

    我不确定您是否使用 CORS,但主体将是相同的,因为它先发送一个 OPTIONS 请求,然后是一个 POST 请求。

    【讨论】:

    • 你在正确的轨道上,但这很奇怪,因为这一切都在当天早些时候为我工作。
    • 好的,所以我已经让选项工作正常了(通过在 Application_BeginRequest 方法中添加一些代码来返回 OPTIONS 请求的标头)。因此,该帖子随后发生,但我从 XMLHttpRequest 收到错误 - 不允许使用原始空值。所以看起来它在帖子中使用的标题是'Origin:null'我可以在提琴手中看到它。这是为什么呢?
    • 如果我查看有效的发布操作,则没有指定原始标头。这解释了它为什么起作用。
    • 我认为这与我使用 jquery 的方式有关,我正在访问 html 文件,包括在 chrome 中这样的 jquery。 'file://C:/Users/petermc/workspace/HelloPhoneGap/assets/www/index.html' 我会尝试使用 IIS 提供它。
    • 好的,现在它工作得更好了,至少如果我在 IIS 中提供 jquery html 页面的话。无论如何,这对我来说似乎不是问题,因为我只是在使用浏览器进行测试。实际应用程序将位于使用 PhoneGap 编译的 android 应用程序中,这将使其成为一个本机应用程序,从而改变这种特定行为。
    【解决方案2】:

    感谢您的回答确实让我走上了解决问题的道路。

    当我使用我正在使用的 ajax javascript 访问 HTML 页面时,

    http://localhost/file.html
    

    但是如果你查看它正在使用的访问 WCF 服务的 javascript,

    http://192.168.54.98/JsonWCFService/Service1.svc/Post
    

    如果我把它们都做成了

    http://mymachinename.domain.com/JsonWCFService/Service1.svc/Post
    http://mymachinename.domain.com/file.html
    

    然后它无需调用 OPTIONS 操作即可工作。

    这并不能解释为什么 OPTIONS 和来自 chrome 的 POST 不起作用。 Chrome 似乎只是忽略了结果。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2016-06-13
      • 2011-01-13
      • 2014-04-06
      • 2017-10-13
      • 2017-10-10
      • 1970-01-01
      相关资源
      最近更新 更多