zoukankan      html  css  js  c++  java
  • ASP.NET Web Api返回对象类型为JSON还是XML

    在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") : "0003";
                string category = queryStrings.HasKey("category") ? queryStrings.GetValue<string>("category") : "0002";
                string docType = queryStrings.HasKey("docType") ? queryStrings.GetValue<string>("docType") : "0001";
                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":"1401410","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":"1401410","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>") + 10, resultXml.IndexOf("</WARRANTY>") - (resultXml.IndexOf("<WARRANTY>") + 10));
                            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>") + 12, resultXml.IndexOf("</OILCOMPANY>") - (resultXml.IndexOf("<OILCOMPANY>") + 12)) + " " + resultXml.Substring(resultXml.IndexOf("<COUNTRY>") + 9, resultXml.IndexOf("</COUNTRY>") - (resultXml.IndexOf("<COUNTRY>") + 9)),
                                Site = resultXml.Substring(resultXml.IndexOf("<SITE>") + 6, resultXml.IndexOf("</SITE>") - (resultXml.IndexOf("<SITE>") + 6)),
                                Customer = resultXml.Substring(resultXml.IndexOf("<CUSTOMER>") + 10, resultXml.IndexOf("</CUSTOMER>") - (resultXml.IndexOf("<CUSTOMER>") + 10)),
                                DespatchDate = UmbracoFuelHelper.FormatDateString(resultXml.Substring(resultXml.IndexOf("<DESPATCHED>") + 12, resultXml.IndexOf("</DESPATCHED>") - (resultXml.IndexOf("<DESPATCHED>") + 12))),
                                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":""}
  • 相关阅读:
    《大道至简》第一章读后感
    第一次随笔,献给结束大一的自己
    altium designer(AD13)隐藏敷铜的方法
    win下如何生成 github ssh公钥 GIT
    怎么把实际路径是英文的文件夹显示中文名?
    Linux GRUB手动安装方法详解
    Altium designer 如何将2D PCB转换成3D
    C++ 谓词(predicate) 与 仿函数 ( functor (function object))
    重载信号函数,解决参数问题
    VS2017常用快快捷键
  • 原文地址:https://www.cnblogs.com/wphl-27/p/5922551.html
Copyright © 2011-2022 走看看