【问题标题】:Getting 500 server error from Ajax call to a SOAP web method in .Net从 .Net 中对 SOAP Web 方法的 Ajax 调用获取 500 服务器错误
【发布时间】:2020-01-28 22:19:06
【问题描述】:

我正在使用 ajax 进行两个不同的异步调用。两者都以相同的方式完成,但一个具有 web 方法的参数。该链接是正确的,当我关注它时,我在浏览器中正确地得到了返回,但我只是不断收到服务器 500 错误。有任何想法吗? 一个没有参数也能正常工作,这里是 JS/jQuery 代码,因为我有点确定它不在 C# 端:

function CatChanged() {
    var strA = $('#ddlCategory').val();
    $.ajax({
        url: encodeURI('https://localhost:44380/WebService1.asmx/GetProducts?category=' + strA),
        data: '<soap: Envelope xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd="http://www.w3.org/2001/XMLSchema" xmlns: soap="http://schemas.xmlsoap.org/soap/envelope/%22%3E<soap: Body><xmlns="http://tempuri.org/" /></soap: Body></soap: Envelope >',
        type: 'POST',
        contentType: "text/xml",
        dataType: "text/xml",
        success: function (response) {
           alert(response.responseText);
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert("ERROR!!");
            alert(xhr.status);
            alert(thrownError);
        }
    });
}

下面是来自后面 C# 代码的 Web 方法代码:

[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string GetCategories()
        {
            Catalog cat = new Catalog();
            JavaScriptSerializer jss = new JavaScriptSerializer();
            return jss.Serialize(cat.categories);
        }

        [WebMethod]
        public string GetProducts(string category)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            Catalog cat = new Catalog();
            List<string> retList = new List<string>();
            switch (category)
            {
                case "Electronics":
                    foreach (Product product in cat.electronicProducts)
                    {
                        retList.Add(product.itemName);
                    }
                    return jss.Serialize(retList);
                case "Apparel":
                    foreach (Product product in cat.apparelProducts)
                    {
                        retList.Add(product.itemName);
                    }
                    return jss.Serialize(retList);
                case "Food and Drink":
                    foreach (Product product in cat.electronicProducts)
                    {
                        retList.Add(product.itemName);
                    }
                    return jss.Serialize(retList);
                default:
                    foreach (Product product in cat.electronicProducts)
                    {
                        retList.Add(product.itemName);
                    }
                    return jss.Serialize(retList);
            }
        }

... 这是我在 Chrome 中点击开发人员控制台的直接链接时在浏览器中获得的返回屏幕截图:

从 url 调用时,web 方法的返回都是好的。这让我认为它必须是 ajax 调用中的某些东西,我不确定当我将参数添加到 web 方法时我需要做些什么不同才能使用它。就像我说的,第一个 web 方法在我的 JavaScript 代码中工作,我能够很好地解析返回的所有内容。

此外,使用任何其他服务、MVC 或类似的东西都不是一种选择。鉴于目前的情况,我必须让它发挥作用。

【问题讨论】:

    标签: javascript c# .net ajax soap


    【解决方案1】:

    好吧,如果我理解正确的话。当您使用浏览器访问 URL 时,结果正常。但是当您进行 ajax 调用时,您遇到了麻烦。

    我从您的代码中注意到的一件事是您正在使用 ajax 调用执行 POST 请求,但这些方法都是 GET。尝试将 ajax 调用中的类型更改为 GET。

    例如

    function CatChanged() {
        var strA = $('#ddlCategory').val();
        $.ajax({
            url: encodeURI('https://localhost:44380/WebService1.asmx/GetProducts?category=' + strA),
            data: '<soap: Envelope xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd="http://www.w3.org/2001/XMLSchema" xmlns: soap="http://schemas.xmlsoap.org/soap/envelope/%22%3E<soap: Body><xmlns="http://tempuri.org/" /></soap: Body></soap: Envelope >',
            type: 'GET', // <-- Changed from POST to GET
            contentType: "text/xml",
            dataType: "text/xml",
            success: function (response) {
               alert(response.responseText);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("ERROR!!");
                alert(xhr.status);
                alert(thrownError);
            }
        });
    }
    

    【讨论】:

    • 是的,抱歉,自从我开始尝试调试以来,我似乎已经更改了所有这些内容一百次。如果我仍然遇到问题,我会用我再次尝试 GET 得到的结果来更新我的问题。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多