在Umbraco平台上开发过程中,我用WebApi返回JSON result给前端

前端使用React调用这个web api来获取JSON result

我写的web api方法是返回JSON 类型的string, 代码如下

        [HttpGet]
[HttpQueryStringFilter("queryStrings")]
public string GetPDFSearchResults(FormDataCollection queryStrings)
{
string product = queryStrings.HasKey("product") ? queryStrings.GetValue<string>("product") : "";
string category = queryStrings.HasKey("category") ? queryStrings.GetValue<string>("category") : "";
string docType = queryStrings.HasKey("docType") ? queryStrings.GetValue<string>("docType") : "";
string terms = queryStrings.HasKey("search") ? queryStrings.GetValue<string>("search") : string.Empty;
var jsonError = JsonHelper.PDFJsonError();
HttpResponseMessage resp = new HttpResponseMessage();
resp.Content = new StringContent(jsonError, System.Text.Encoding.UTF8, "application/json");
if (!string.IsNullOrEmpty(terms))
{ var results = Umbraco.PerformContentSearch(terms, product, category, docType); //var jsonResult = JsonConvert.SerializeObject(results);
var jsonResult = "";
foreach (PDFSearchResult mapResult in results)
{ var docTypeJson = JsonHelper.getJsonByObject(mapResult.DocumentType);
docTypeJson = docTypeJson.TrimStart('[').TrimEnd(']');
docTypeJson = docTypeJson.Replace(@"\/", "/");
var categoryJson = JsonHelper.getJsonByObject(mapResult.Category);
categoryJson = categoryJson.TrimStart('[').TrimEnd(']');
var productJson = JsonHelper.getJsonByObject(mapResult.Product);
productJson = productJson.TrimStart('[').TrimEnd(']'); jsonResult += "{\"id\":" + mapResult.Id + ",";
jsonResult += "\"approvalStatus\":\"" + mapResult.ApprovalStatus + "\",";
jsonResult += "\"score\":\"" + mapResult.Score + "\",";
jsonResult += "\"title\":\"" + mapResult.Title + "\",";
jsonResult += "\"file_name\":\"" + mapResult.pdfName + "\",";
jsonResult += "\"url\":\"" + mapResult.FileUrl + "\",";
jsonResult += "\"create_date\":\"" + mapResult.CreateDate + "\",";
jsonResult += "\"update_date\":\"" + mapResult.UpdateDate + "\","; jsonResult += JsonHelper.GetConditionJson(docTypeJson, categoryJson, productJson) + "},";
} jsonResult = jsonResult.TrimEnd(','); return jsonResult //return Json(searchResults, JsonRequestBehavior.AllowGet); }
else
{
return "Search term not found"
//return Json("Search term not found", JsonRequestBehavior.AllowGet); } }

但在Chrome客户端调用这个web api时,发现它返回的是

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
{"company":"Aus 7-11 Mobil Australia","customer":"ECL Group Australia Pty Ltd","dispatch_date":"2015-02-12","has_warranty":false,"serial_number":"","site":"2273 West Ryde","warranty_date":""}
</string>

或者在IE上返回的是

"{\"company\":\"Aus 7-11 Mobil Australia\",\"customer\":\"ECL Group Australia Pty Ltd\",\"dispatch_date\":\"2015-02-12\",\"has_warranty\":false,\"serial_number\":\"1401410\",\"site\":\"2273 West Ryde\",\"warranty_date\":\"\"}"

而我实际需要的返回结果是

{"company":"Aus 7-11 Mobil Australia","customer":"ECL Group Australia Pty Ltd","dispatch_date":"2015-02-12","has_warranty":false,"serial_number":"","site":"2273 West Ryde","warranty_date":""}

如何解决呢

在读了这篇文章 http://www.luckyonecn.com/blog/fix_content-type_to_Applicationjson_in_WebApi/ 后,

我对代码进行了改写,返回HttpResponseMessage, 限定返回的ContentType 为application/json, 改写后代码如下

        [HttpGet]
[HttpQueryStringFilter("queryString")]
public HttpResponseMessage GetWarrantySearchResult(FormDataCollection queryString)
{
string serialNum = queryString.HasKey("search") ? queryString.GetValue<string>("search").Trim() : string.Empty;
var jsonError = JsonHelper.WarrantyJsonError();
HttpResponseMessage resp = new HttpResponseMessage();
resp.Content = new StringContent(jsonError, System.Text.Encoding.UTF8, "application/json");
if (!string.IsNullOrEmpty(serialNum))
{
try
{ //Send SOAP Request
WebRequest webRequest = WebRequest.Create("http://gglnzdom1/pec/product.nsf/getWarranty?WSDL");
HttpWebRequest httpRequest = (HttpWebRequest)webRequest;
httpRequest.Method = "POST";
httpRequest.ContentType = "text/xml; charset=utf-8";
httpRequest.ProtocolVersion = HttpVersion.Version11;
httpRequest.Credentials = CredentialCache.DefaultCredentials;
Stream requestStream = httpRequest.GetRequestStream();
//Create Stream and Complete Request
StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII); string soapRequest = "<soapenv:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:urn='urn:DefaultNamespace'><soapenv:Header/><soapenv:Body><urn:GETWARRANTYARRAY soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'><SERIAL xsi:type='xsd:string'>" + serialNum + "</SERIAL></urn:GETWARRANTYARRAY></soapenv:Body></soapenv:Envelope>";
streamWriter.Write(soapRequest.ToString());
streamWriter.Close(); //Get SOAP response
HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse(); StreamReader srd = new StreamReader(wr.GetResponseStream());
string resultXmlFromWebService = srd.ReadToEnd(); if (resultXmlFromWebService.Contains("Serial Number not found</OILCOMPANY>"))
{
return resp; }
else if (resultXmlFromWebService.Contains("<faultstring>"))
{
return resp; }
else
{
var resultXml = resultXmlFromWebService.Replace(" xsi:type=\"xsd:string\"", ""); var warrantyInfo = resultXml.Substring(resultXml.IndexOf("<WARRANTY>") + , resultXml.IndexOf("</WARRANTY>") - (resultXml.IndexOf("<WARRANTY>") + ));
bool hasWarranty = false;
DateTime warrantyDate;
var warrantyDateStr = "";
if (DateTime.TryParse(warrantyInfo, out warrantyDate))
{
hasWarranty = true; }
if (hasWarranty)
warrantyDateStr = UmbracoFuelHelper.FormatDateString(warrantyInfo); var warrantyResult = new WarrantySearchResult()
{
SerialNumber = serialNum,
Company = resultXml.Substring(resultXml.IndexOf("<OILCOMPANY>") + , resultXml.IndexOf("</OILCOMPANY>") - (resultXml.IndexOf("<OILCOMPANY>") + )) + " " + resultXml.Substring(resultXml.IndexOf("<COUNTRY>") + , resultXml.IndexOf("</COUNTRY>") - (resultXml.IndexOf("<COUNTRY>") + )),
Site = resultXml.Substring(resultXml.IndexOf("<SITE>") + , resultXml.IndexOf("</SITE>") - (resultXml.IndexOf("<SITE>") + )),
Customer = resultXml.Substring(resultXml.IndexOf("<CUSTOMER>") + , resultXml.IndexOf("</CUSTOMER>") - (resultXml.IndexOf("<CUSTOMER>") + )),
DespatchDate = UmbracoFuelHelper.FormatDateString(resultXml.Substring(resultXml.IndexOf("<DESPATCHED>") + , resultXml.IndexOf("</DESPATCHED>") - (resultXml.IndexOf("<DESPATCHED>") + ))),
HasWarranty = hasWarranty,
WarrantyDate = warrantyDateStr }; var jsonWarranty = JsonHelper.getJsonByObject(warrantyResult); resp.Content = new StringContent(jsonWarranty, System.Text.Encoding.UTF8, "application/json"); return resp; //return JsonConvert.SerializeObject(jsonWarranty); }
}
catch (Exception ex)
{
throw ex;
} }
else
{
return resp;
} }

现在返回的就是JSON

{"company":"Aus 7-11 Mobil Australia","customer":"ECL Group Australia Pty Ltd","dispatch_date":"2015-02-12","has_warranty":false,"serial_number":"1401410","site":"2273 West Ryde","warranty_date":""}

ASP.NET Web Api返回对象类型为JSON还是XML的更多相关文章

  1. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  2. ASP.NET WEB API 返回JSON 出现2个双引号问题

    前言          在使用ASP.NET WEB API时,我想在某个方法返回JSON格式的数据,于是首先想到的就是手动构建JSON字符串,如:"{\"result\" ...

  3. ASP.NET Web API 2 媒体类型格式化程序

    Ø  简介 在之前的ASP.NET Web API 2 消息处理管道文章中有提到,在 Web API 的生命周期中,还包含比较中要的一部分,就是媒体类型格式化程序,该程序主要用于处理 Web API ...

  4. ASP.NET Web API 2.1支持Binary JSON(Bson)

    ASP.NET Web API 2.1内建支持XML.Json.Bson.form-urlencoded的MiME type,今天重点介绍下Bson.BSON是由10gen开发的一个数据格式,目前主要 ...

  5. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

  6. asp.net web api返回图片至前端

    var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new ByteArrayContent(da ...

  7. ASP.NET Web API 2 入门(一)

    前言 HTTP 不是只是为了服务的 web 页.这也是建设公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以 ...

  8. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  9. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

随机推荐

  1. adb shell settings ....

    Android4.2的源码android-17\com\android\commands目录下较之前的版本多了一个settings命令,查看其中的SettingsCmd.java文件,末尾有命令的帮助 ...

  2. bzoj3983

    显然我们得到这样几个结论 1.每次攻击对方一定是攻击最大的 2.自己合并也是合并最大和次大的 我们只要穷举下一开始是攻击还是合并,之后就是能攻击先攻击否则就合并 ..] of int64; var a ...

  3. sql Server 的基本函数

    --聚合函数 use pubs go select avg(distinct搜索 price) --算平均数 from titles where type='business' go use pubs ...

  4. CodeForces Round #279 (Div.2)

    A: 题意: 有三个项目和n个学生,每个学生都擅长其中一个项目,现在要组成三个人的队伍,其中每个人恰好擅长其中一门,问能组成多少支队伍. 分析: 最多能组成的队伍的个数就是擅长项目里的最少学生. #i ...

  5. POJ 1833 排列

    题意: 给你某个排列 求从下一个排列开始的第k个排列如果是最后一个排列 则下一个排列为1 2 3 ... n// 1 用stl 里面的 next_permutation// 2 用生成下一个排列算法/ ...

  6. lnmp脚本

    #!/bin/sh echo "欢迎使用 lnmp 脚本 (fanshengshuai@gmail.com) "; echo "增加资源..."; rpm -i ...

  7. 【unity3D】鼠标控制camera的移动、放大(俯视浏览效果、LOL摄像机移动效果)

    在Unity开发中,用鼠标滚轮来实现摄像机的视野范围,鼠标左键拖拉控制摄像机的移动,代码如下: 1.俯视浏览效果 using UnityEngine; using System.Collections ...

  8. TCP/IP详解学习笔记(10)-TCP连接的建立与中止

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...

  9. 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8

    [问题] 折腾: [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 过程中,增大对应AVD的内存为2G后,结果无法启 ...

  10. JS调试必备的5个debug技巧

    我一直使用printf调试程序,一般来说都是比较顺利,但有时候,你会发现需要更好的方法.下面几个JavaScript技巧相信你一定会觉得十分有用   1. debugger; 我以前也说过,你可以在J ...