Вызов службы ASP.NET 4.0 WCF из jQuery приводит к 400 ошибочным запросам - PullRequest
5 голосов
/ 08 апреля 2011

Я знаю, что кажется, что этот вопрос был опубликован много раз, но я прочитал почти все из них (большинство учебников в Интернете), и я все еще не могу понять, что я делаю неправильно.

Я пытался реализовать на веб-сайте, мы разрабатываем веб-сервис WCF, который будет использоваться сценарием jQuery, но я продолжаю получать 400 Bad Request при выполнении запроса AJAX, и я начинаю терять надежду.

Обратите внимание, что я новичок в WCF, и я сформировал себя только через онлайн-уроки, так что вполне возможно, что я что-то упустил или в основном испортил.

Вопросы, которые я пытался, ноне помогло:

Внешние ресурсы, которые я прочитал безрезультатно:

Я также пытался создать новое решение, только с страницей и службой, чтобы исключить помехи, но у меня все еще остается та же проблема,Здесь вы можете найти код:

IService.cs

namespace WebService
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;

    [ServiceContract(Name = "Service", Namespace = "WebService")]
    public interface IService
    {
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        String Test();
    }
}

Service.svc.cs

namespace WebService
{
    using System;

    public class Service : IService
    {
        public String Test()
        {
            return "Hello, world.";
        }
    }
}

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebService.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $("#doAjax").click(function (event) {
                    event.preventDefault();
                    jQuery.ajax({
                        contentType: "application/json"
                        , dataType: "text"
                        , error: function (jqXHR, textStatus, errorThrown) {
                            console.group("AJAX error:");
                            console.debug(jqXHR);
                            console.debug(textStatus);
                            console.groupEnd();
                        }
                        , processData: false
                        , success: function (data, textStatus, jqXHR) {
                            console.group("AJAX success:");
                            console.debug(data);
                            console.debug(textStatus);
                            console.debug(jqXHR);
                            console.groupEnd();
                        }
                        , type: "post"
                        , url: "/Service.svc/Test"
                    });
                });
            });
        </script>
        <title>WebService</title>
    </head>
    <body>
        <form runat="server">
            <h1><%= this.Page.Title %></h1>
            <p><input id="doAjax" type="button" value="Run" /></p>
        </form>
    </body>
</html>

Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <bindings />
        <client />
        <behaviors>
            <endpointBehaviors>
                <behavior name="Behavior">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
        <services>
            <service name="Service">
                <endpoint behaviorConfiguration="Behavior" binding="webHttpBinding" contract="WebService.IService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Название услуги должно быть полностью квалифицированным.Попробуйте: <service name="WebService.Service">

1 голос
/ 29 апреля 2011

Эй! У меня возникла та же проблема (..... опять же), но, наконец, я понял и все заработало правильно.

Теперь это мой собственный пример, но поскольку он работал для меня, надеюсь, он будет работать и для вас ... Ключевая строка, которую я забыл, была в моей команде $ ajax:

contentType: "application/json; charset=utf-8"

Удачи :) Я потратил полдня на эту проблему.

Интерфейс:

[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
int CreateMilestone(Milestone Input);

Класс:

[DataContract]
public class Milestone
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Date { get; set; }
    [DataMember]
    public int Risk { get; set; }
    [DataMember]
    public int Complexity { get; set; }
}

метод:

   public int CreateMilestone(Milestone Input)
    {
        return 0;
    }

Вопрос:

$("#btnSubmit").click(function () {

    if ($.trim($("#txtName").val()) == "") {
        $("#dName").effect("highlight", 500);
    }
    else {

        var date = $("#txtDate").datepicker("getDate");
        var data = {
            Name: $("#txtName").val(),
            Date: (date.getMonth() + 1) + "-" + date.getDate() + "-" + date.getFullYear(),
            Risk: parseInt($("#sRisk").text()),
                Complexity: parseInt($("#sComplexity").text())
            };
            var jsondata = JSON.stringify(data);
            $.ajax({
                type: "POST",
                async: false,
                url: 'Services/ProjectService.svc/CreateMilestone',
                contentType: "application/json; charset=utf-8",
                data: jsondata,
                dataType: "json",
                success: function (msg) {
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    //                        alert(XMLHttpRequest.status);
                    //                        alert(XMLHttpRequest.responseText);
                }
            });
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...