WCF服务失败,方法不允许

时间:2012-01-11 02:27:29

标签: jquery wcf

我有一个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>

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

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

2 个答案:

答案 0 :(得分:6)

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

这将是你的问题:

  1. 我认为,OPTIONS默认关闭了OPTIONS。可能的起点是:http://www-jo.se/f.pfleger/cors-and-iis
  2. OPTIONS动词将使其成为您实际的POST方法,因此您需要在WCF中将某些内容过滤OPTIONS到另一个具有相同返回类型且无效的方法。并将POST动词过滤为您的实际方法。如果你不这样做,你会发现你的方法被调用两次的奇怪行为,或者它会引发webservice模糊的异常。
  3. 我不确定您是否使用CORS,但主体将是相同的,因为它发送OPTIONS请求然后发送POST请求。

答案 1 :(得分:1)

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

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

http://localhost/file.html

但是如果你看一下javascript它正在使用

访问WCF服务
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似乎忽略了结果。