WCF REST服务不在FireFox和Chrome中从POST返回数据

时间:2013-08-30 09:36:21

标签: json wcf cross-domain cors

我有一个使用JSON的WCF REST样式服务,它在IE中运行良好,但FireFox和Chrome正在发脾气;关于跨域调用的事情。

我按照这里的建议: Problem sending JSON data from JQuery to WCF REST method

但我现在看到的是,虽然我的浏览器发送了2个请求(首先是OPTIONS,然后是POST),但POST请求根本不会返回任何内容。 IE再次与此完美配合。有什么遗漏?

enter image description here

JAVASCRIPT

<script type="text/javascript">
    function Search() {

        var json = JSON.stringify($('#testForm').serializeObject());

        $.ajax(
        {
            type: "POST",
            url: "http://localhost:8000/MyService.svc/Search",
            data: json,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response, status, xhr) {
                GetResults(response.SearchResult.QueryId);
            },
            error: function (xhr, status, error) {
                alert("Error\n-----\n" + xhr.status + '\n' + xhr.responseText);
            },
            //complete: function (jqXHR, status) { alert('Status: ' + status + '\njqXHR: ' + JSON.stringify(jqXHR)); }
        });

        return false;
    }

    function GetResults(queryId) {
        debugger;
        $.ajax(
        {
            type: "GET",
            url: "http://localhost:8000/MyService.svc/GetResults?queryId=" + queryId + "&ignoreXmlFeedSourceIds=",
            //data: {},
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            success: function (response, status, xhr) {
                debugger;
                DoSomethingWithResults(response);
            },
            error: function (xhr, status, error) {
                alert(error);
            },
            complete: function (jqXHR, status) { alert('Status: ' + status + '\njqXHR: ' + JSON.stringify(jqXHR)); }
        });
    }

    function DoSomethingWithResults(results) {
        alert("In DoSomethingWithResults()");
        // process the results here to show on UI
        debugger;
    };

    $.fn.serializeObject = function () {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function () {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };

</script>

服务合同

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/Search")]
    SearchResponse Search(RequestInfo requestInfo);

    [OperationContract]
    [WebInvoke(Method = "OPTIONS", UriTemplate = "/Search")]
    void SearchAllowCors();

    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/GetResults?queryId={queryId}&ignoreXmlFeedSourceIds={ignoreXmlFeedSourceIds}")]
    IList<FlightJourneyAvailabilityResponse> GetResults(string queryId, string ignoreXmlFeedSourceIds);
}

1 个答案:

答案 0 :(得分:0)

我遇到了很多问题,使得WCF可以正常使用JSON / REST ..所以我学习了新的ASP.NET Web API,这使得这更加简单。对于任何新的Web服务,我可能会使用它而不是WCF。