XMLHttpRequest无法加载。 No POST-Control-Allow-Origin仅适用于POST呼叫且仅通过实际本地网站

时间:2014-07-11 19:59:32

标签: javascript html ajax servicestack xmlhttprequest

我看到很多关于此的请求,看了一下,没有看到我的特定问题,但我很可能错过了它。如果是这样抱歉。

我正在建立一个呼叫服务堆栈服务的网站。该服务已发布并托管在服务器上。

我在尝试对服务进行GET调用并发现添加此

时遇到此错误
            base.SetConfig(new EndpointHostConfig
        {
            GlobalResponseHeaders = {
        { "Access-Control-Allow-Origin", "*" },
        { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
        { "Access-Control-Allow-Headers", "Content-Type" },
        },
        });

解决了这个问题。然而现在通过网站进行ajax调用

$.ajax({
                    type: 'POST',
                    url: "https://pirates.com/SHIPSWS/shipDemo",
                    data: {
                        "Bow": $("#BowTypes").val(),
                        "BodyContent": CKEDITOR.instances.body.getData()
                    },
                    success: function (data) {
                        EmailBody = data;
                    }
                })

我得到了同样的错误

XMLHttpRequest cannot load https://pirates.com/SHIPSWS/shipDemo. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:58032' is therefore not allowed access. 

这使我感到困惑,因为我设置了上述内容以及在网站中通过ajax工作之前调用的GET语句,就像魅力一样。

让我感到困惑的是,如果我使用say,邮递员会为chrome添加一个实际的邮件请求。它没有问题。

有人会有任何想法我做错了吗?

编辑#1

从本地网站拨打电话时使用Chrome标题。

Request URL:https://pirates.com/SHIPSWS/shipDemo
Request Headers CAUTION: Provisional headers are shown.
Accept:*/*
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Origin:http://localhost:58032
Referer:http://localhost:58032/Default.aspx
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Form Dataview sourceview URL encoded
Bow:Front
BodyContent:<p>Yarrrrrrr Matey</p>

编辑#2在网站上工作

 $.ajax
            ({
                url: "https://pirates.com/SHIPSWS/shipDemo/ships/" + this.value + "?format=json",
                success: function (data) {
                    ShipList = data;
                         Emails = $("#EmailTable").dataTable({
                        "bDestroy": true,
                        "aaData": ShipList ,
                        "aoColumns": [
                            {
                                "sTitle": "Email Address",
                                "mData": "emailAddress"
                            },
                            {
                                "sTitle": "First Name",
                                "mData": "firstName"
                            },
                            {
                                "sTitle": "Last Name",
                                "mData": "lastName"
                            },
                            {
                                "sTitle": "Ship Number",
                                "mData": "shipNumber"
                            },
                            {
                                "sTitle": "Shipsize",
                                "mData": "shipsize"
                            },
                            {
                                "sTitle": "Select",
                                "mData": "emailAddress",
                                "mRender": function (data, type, full) {
                                    return '<input type="checkbox" class="check1" name="check1" value="' + data + '">';
                                },
                            }
                        ]
                    });

2 个答案:

答案 0 :(得分:0)

因此,在使用它之后,后调用将发送

Yarrrrrrr Matey

作为其数据(BodyContent)的一部分。这导致错误。

我最终从这里的另一个问题中抓住了这个功能

        function htmlEncode(value) {
        //create a in-memory div, set it's inner text(which jQuery automatically encodes)
        //then grab the encoded contents back out.  The div never exists on the page.
        return $('<div/>').text(value).html();
    }

并编码了我的ajax调用的一部分

$.ajax({
                type: 'POST',
                url: "https://pirates.com/SHIPSWS/shipDemo",
                data: {
                    "Bow": $("#BowTypes").val(),
                    "BodyContent": htmlEncode(CKEDITOR.instances.body.getData())
                },
                success: function (data) {
                    EmailBody = data;
                }
            })

它现在就像一个魅力。感谢大家的帮助!

(解码html只需在服务中的数据上使用它)

function htmlDecode(value){
  return $('<div/>').html(value).text();
}

答案 1 :(得分:-1)

您是否可以访问该服务,即您是所有者吗?该服务的所有者需要在Access-Control-Allow-Origin标题部分中允许您的来源(您的域)。

因此,在您正在调用的服务上,请确保已设置标头"Access-Control-Allow-Origin": "http://yourdomain.com"