【问题标题】:Return JSON instead of XML from web service using Ajax while 'contentType' is 'false'当“contentType”为“false”时,使用 Ajax 从 Web 服务返回 JSON 而不是 XML
【发布时间】:2018-10-08 23:44:22
【问题描述】:

我进行了 AJAX 调用以将图像文件发送到我的 Web 服务 (.asmx) 方法之一。一切正常,但问题是 Web 服务返回 XML 而不是 JSON,因为我必须将 'contentType' 设置为 'false',否则无法发送文件。 (如果我将 contentType 设置为 application/json; charset=utf-8,它会返回 JSON,但我不能这样做,因为我正在发送文件。)

这是我的 JavaScript:

function setAvatar(imageFile, successCallback) {
var formData = new FormData();
formData.append("UploadedAvatar", imageFile);
$.ajax({
    type: "POST",
    url: "/Services/UserService.asmx/SetAvatar",
    contentType: false,
    processData: false,
    dataType: 'json',
    data: formData,
    success: function (result) {
        alert(result.d);
        alert(result.d.IsSuccessful);
        if (typeof successCallback === 'function')
            successCallback(result);
    }
});

以及web服务方法:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Result SetAvatar()
{
    HttpPostedFile postedFile = HttpContext.Current.Request.Files["UploadedAvatar"];
    Image avatar = Image.FromStream(postedFile.InputStream, true, true);
    avatar = new Bitmap(avatar, new Size(150, 150));
    avatar.Save(Path.Combine(path, $"Avatar-Small.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);

    return new Result(true, Messages.AvatarSavedSuccessfully);
}

【问题讨论】:

  • 查看我的回答here。您正在尝试返回一个对象,但必须先对其进行序列化。之后您可能可以删除 contentType 并使用默认设置。
  • @wazz 这对我没有帮助
  • 看到这个stackoverflow.com/questions/42360139/…,确保你有options.RespectBrowserAcceptHeader = true;,这样返回类型就基于Accept这个头

标签: javascript jquery asp.net ajax web-services


【解决方案1】:

在发出期望 JSON 的请求时设置 Accept 标头

$.ajax({
    type: "POST",
    url: "/Services/UserService.asmx/SetAvatar",
    headers: { //SET ACCEPT HEADER
        Accept : "application/json; charset=utf-8",
    },  
    contentType: false,
    processData: false,
    dataType: 'json',
    data: formData,
    success: function (result) {
        alert(result.d);
        alert(result.d.IsSuccessful);
        if (typeof successCallback === 'function')
            successCallback(result);
    }
});

在服务器端,使用Json.Net可以序列化结果

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string SetAvatar() {
    HttpPostedFile postedFile = HttpContext.Current.Request.Files["UploadedAvatar"];
    Image avatar = Image.FromStream(postedFile.InputStream, true, true);
    avatar = new Bitmap(avatar, new Size(150, 150));
    avatar.Save(Path.Combine(path, $"Avatar-Small.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);

    var result = new Result(true, Messages.AvatarSavedSuccessfully);
    return JsonConvert.SerializeObject(result);
}

这应该允许响应为所需的类型

【讨论】:

  • 当我添加这段代码时,我得到了ajax错误,因为服务方法的结果不是JSON
  • @AmirHosseinAhmadi 目前的结果是什么样的
  • 结果仍然是一个 XML 文档 :(
  • @AmirHosseinAhmadi 即使有关于服务器的最新建议?显示结果的 sn-p。是 XML 包装 JSON 吗?
  • 第二个建议也返回 XML。 :(我今天会提出一个问题
【解决方案2】:

您需要更新您的.NET 代码并添加options.RespectBrowserAcceptHeader = true

services
    .AddMvc(options => {
        options.RespectBrowserAcceptHeader = true;
    })
    //support application/xml
    .AddXmlDataContractSerializerFormatters()
    //support application/json
    .AddJsonOptions(options => {
        // Force Camel Case to JSON
        options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    });

dataType: 'json' 将自动添加Accept 标题,如下所示

"accept":"application/json, text/javascript, */*; q=0.01"

如果您特别想要application/json,那么您需要在您的 ajax 选项中添加以下内容

headers: {
  Accept : "application/json; charset=utf-8"
}

【讨论】:

【解决方案3】:

头疼了好几天,终于找到了属于Ajay, here的解决方案。

虽然没有其他任何帮助我,但我使用了它并且效果很好:

  1. 将方法的返回类型更改为void

  2. 然后,您无需在方法中编写 return 语句,而是需要这样做以返回一个值:

    Context.Response.ContentType = "application/json; charset=utf-8";
    Context.Response.Write(new JavaScriptSerializer().Serialize(new YourData()));
    
  3. 之后,您可以使用 Ajax 调用的success 事件轻松获得结果:

    success: function (result) {
        alert(result.Property); // Note: Don't use result.d here
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 2023-04-05
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多