在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. 一个简单的iBatis入门例子

    一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...

  2. 可视化PK纯代码

    简述 其实今天说的内容不仅仅局限于Qt,在很多其它语言或者框架中也适用,那就是 - 用可视化工具or文本编辑器?拖or不拖? 如果有人问我喜欢脱or不脱?我会毫不犹豫地说不脱,因为我比较矜持O(∩_∩ ...

  3. UVa 10791 (唯一分解) Minimum Sum LCM

    题意: 输入n,求至少两个正整数,使得这些数的最小公倍数为n且和最小. 分析: 设n的分解式为,很显然单独作为一项,和最小. 这里有两个小技巧: 从2开始不断的除n,直到不能整除为止.这样就省去了素数 ...

  4. asp.net实现文件解压和压缩

    C#解压RAR压缩文件(--转载--测试通过) using System; using System.Collections.Generic; using System.Text; using Sys ...

  5. Python interview preparing

    Collection & Recommended: 1. CN - 论坛中看到. - EN 英文原文真的真的很好好好T_T,看得让人感动T_T 总结个人感兴趣的问题(以下部分参照上面): 1. ...

  6. h264检测是I帧还是P帧,解决录像第一帧有马赛克问题

    最近使用h264码流数据进行录像,但是录出来的第一帧有马赛克,究其原因是录像的第一帧不是关键帧,所以需要录像是需要判断第一帧是否是关键帧,方法有两种,第一种是原码流的基础上查找,第二种是将原码流传递给 ...

  7. JazzyViewPager开源项目的简析及使用

    JazzyViewPager是一个重写的ViewPager,能是ViewPager滑动起来更加的炫酷. 开源地址:https://github.com/jfeinstein10/JazzyViewPa ...

  8. Spring学习之Ioc

    Ioc原理讲解:http://www.cnblogs.com/xdp-gacl/p/4249939.html Ioc IoC是一种编程思想,由主动编程变为被动接收. 也就是说,所有的组件都是被动的(p ...

  9. Android 项目利用 Android Studio 和 Gradle 打包多版本APK

    在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_ap ...

  10. android学习笔记五

    Android中的category大全 Api Level 3(SDK 1.5)和Api Level 4(SDK 1.6): android.intent.category.ALTERNATIVE a ...