尝试通过AJAX发布到WCF Web服务时出现GET错误

时间:2015-11-29 16:15:05

标签: c# jquery ajax web-services wcf

我有一个mvc项目,我正在尝试发布到我通过Web表单和AJAX调用创建的WCF服务。当它遇到WebService时我遇到了一个错误,它说的只是GET。

以下是它的图像: enter image description here

以下是AJAX的重要部分:

SRCS = $(wildcard *.c) $(wildcard srcs/*.c)

通常情况下,数据会从表单中生成,但我只是为了测试目的而对其进行了硬编码。

网络服务部分如下所示:

    var songRequest = {
        Title: 'New Slang',
        Artist: 'The Shins',
        Genre: 'Indie',
        Difficulty: 'Easy',
        id: 11
    };

    $(document).ready(function () {

        $("#createSong").on("click", "#saveSong", function () {

            $.ajax({
                url: 'http://localhost:17476/SongRESTService.svc/json/PostJson/',
                dataType: 'jsonp',
                contentType: 'application/json',
                data: JSON.stringify(songRequest),
                method: "POST"
            }).done(function (response, b, c) {
                console.log(response, b, c);

            }).error(function (xhr) {
                console.log(xhr);
                alert("There was an error saving the song. Please try again.");
            });

        });
    });

有什么想法吗?

编辑:网络标签错误: enter image description here

1 个答案:

答案 0 :(得分:0)

您已指定dataType: 'jsonp'并尝试发出一个没有任何意义的POST请求,因为JSONP仅适用于GET请求(至少在jQuery的实现中)。如果您需要使用POST动词,可以考虑使用CORS。为此,您可以在服务器上全局启用CORS,方法是将以下内容添加到Global.asax

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE, GET, OPTIONS");
            HttpContext.Current.Response.End();
        }
    }
}

现在从你的AJAX调用中删除这个dataType: 'jsonp'

如果您使用IIS,另一种可能性是将以下内容添加到您的web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
            <add name="Access-Control-Allow-Credentials" value="true" />
        </customHeaders>
    </httpProtocol>
</system.webServer>