在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. Codeforces Round #272 (Div. 2)

    A. Dreamoon and Stairs 题意:给出n层楼梯,m,一次能够上1层或者2层楼梯,问在所有的上楼需要的步数中是否存在m的倍数 找出范围,即为最大步数为n(一次上一级),最小步数为n/2 ...

  2. HDU 4607 Park Visit (DP最长链)

    [题目]题意:N个城市形成一棵树,相邻城市之间的距离是1,问访问K个城市的最短路程是多少,共有M次询问(1 <= N, M <= 100000, 1 <= K <= N). [ ...

  3. Sublime-text markdown with Vim mode and auto preview

    说明 最近看到markdown相关的东西,被其书写方式吸引,其实以前就在找这种类似的工具,但是也没找到,由于习惯了Vim,可Vim不支持markdown预览,这点可能不是很好,于是找到Sublime- ...

  4. 使用java解析和制作二维码

    项目结构 文件源码 QR.zip 第一步:导入zxing的两个架包 core.jar和javase.jar 第二步:使用工具类 MatrixToImageWriter.java package uti ...

  5. Java [leetcode 1] Two Sum

    小二终于开通博客了,真是高兴.最近在看Java,所以就拿leetcode练练手了.以后我会将自己解体过程中的思路写下来,分享给大家,其中有我自己原创的部分,也有参考别人的代码加入自己理解的部分,希望大 ...

  6. 庖丁解牛-----Live555源码彻底解密(RTP打包)

    本文主要讲解live555的服务端RTP打包流程,根据MediaServer讲解RTP的打包流程,所以大家看这篇文章时,先看看下面这个链接的内容; 庖丁解牛-----Live555源码彻底解密(根据M ...

  7. 载入在线jQuery库

    以百度库为例 <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script&g ...

  8. Android常用组件

    UI相关 图片 Android-Universal-Image-Loader:com.nostra13.universalimageloader:异步加载.缓存.显示图片 ImageLoader:co ...

  9. C# Code for Downloading Stock Symbols z

    http://www.jarloo.com/download-stock-symbols/ If your using C# you can easily get the XML data using ...

  10. 炮兵阵地(POJ 1185状压dp)

    题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...