当“contentType”为“false”时,使用 Ajax 从 Web 服务返回 JSON 而不是 XML
Posted
技术标签:
【中文标题】当“contentType”为“false”时,使用 Ajax 从 Web 服务返回 JSON 而不是 XML【英文标题】:Return JSON instead of XML from web service using Ajax while 'contentType' is 'false' 【发布时间】: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 这对我没有帮助 看到这个***.com/questions/42360139/…,确保你有options.RespectBrowserAcceptHeader = true;
,这样返回类型就基于Accept
这个头
【参考方案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"
【讨论】:
我应该把代码放在哪里?换句话说,什么是“服务”变量? 看到这个帖子docs.microsoft.com/en-us/aspnet/core/fundamentals/… 对此有何反馈?【参考方案3】:头疼了好几天,终于找到了属于Ajay, here的解决方案。
虽然没有其他任何帮助我,但我使用了它并且效果很好:
将方法的返回类型更改为void
。
然后,您无需在方法中编写 return
语句,而是需要这样做以返回一个值:
Context.Response.ContentType = "application/json; charset=utf-8";
Context.Response.Write(new JavaScriptSerializer().Serialize(new YourData()));
之后,您可以使用 Ajax 调用的success
事件轻松获得结果:
success: function (result)
alert(result.Property); // Note: Don't use result.d here
【讨论】:
以上是关于当“contentType”为“false”时,使用 Ajax 从 Web 服务返回 JSON 而不是 XML的主要内容,如果未能解决你的问题,请参考以下文章
使带有 imageView 的 UIButton 看起来被禁用而不将 isEnabled 设置为 false
当通过地图呈现切换按钮列表时如何使react native切换为true?
Autojs知道clickable为false时,知道控件信息如何实现定位单击操作?
当 ShowsPlaybackControls 为 False 时,AVPlayerViewController 不会自动旋转视频