麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

WebAPI接收JSON參數注意事項

2019-11-14 14:27:06
字體:
來源:轉載
供稿:網友

運行環境:asp.net 4.5.2。

當我們向GlobalConfiguration.Configuration.MessageHandlers添加一個DelegatingHandler派生類后,很容易發生即使命中了Action,但方法參數值為null的問題。

在大多數情況下,我們會在DelegatingHandler派生類里,重寫async Task<HttPResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)方法。

在方法內,做一些事情,比如說訪問日志記錄,任意校驗,添加Header,修改URL(重寫)等工作。

其中最重要需要注意的一點在于request.Content,當我們在方法內訪問了request.Content (get)之后,而不對request.Content進行賦值(set)的話,會發生什么呢?

這會導致我們的方法(action)無法獲取到客戶端Post上來的數據,導致方法參數值為null。

這是為什么呢,這個中原因,我沒去深究。

現在附上解決代碼:

 1 public class DefaultHandler : DelegatingHandler 2 { 3     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 4     { 5         request.RequestUri = new Uri(request.RequestUri.ToString()); 6  7         MediaTypeHeaderValue contentType = request.Content.Headers.ContentType; 8  9         if (contentType != null)10         {11             switch (contentType.MediaType)12             {13                 case "application/x-www-form-urlencoded":14                     {15                         NameValueCollection formData = await request.Content.ReadAsFormDataAsync(cancellationToken);16                         request.Content = new FormUrlEncodedContent(Correct(formData));17                         //TODO:在這里對formData進行業務處理18                     }19                     break;20                 case "multipart/form-data":21                     {22                         NameValueCollection formData = await request.Content.ReadAsFormDataAsync(cancellationToken);23                         request.Content = new FormUrlEncodedContent(Correct(formData));24                         //TODO:在這里對formData進行業務處理25                     }26                     break;27                 case "application/json":28                     {29                         HttpContentHeaders oldHeaders = request.Content.Headers;30                         string formData = await request.Content.ReadAsStringAsync();31                         request.Content = new StringContent(formData);32                         ReplaceHeaders(request.Content.Headers, oldHeaders);33                         //TODO:在這里對formData進行業務處理34                     }35                     break;36                 default:37                     throw new Exception("Implement It!");38             }39         }40 41         return await base.SendAsync(request, cancellationToken);42     }43 44     private static IEnumerable<KeyValuePair<string, string>> Correct(NameValueCollection formData)45     {46         return formData.Keys.Cast<string>().Select(key => new KeyValuePair<string, string>(key, formData[key])).ToList();47     }48 49     private static void ReplaceHeaders(HttpHeaders currentHeaders, HttpHeaders oldHeaders)50     {51         currentHeaders.Clear();52         foreach (var item in oldHeaders)53             currentHeaders.Add(item.Key, item.Value);54     }55 }

 

在Global.asax添加代碼:

1 protected void Application_Start()2 {3     GlobalConfiguration.Configure(WebApiConfig.Register);4     GlobalConfiguration.Configuration.MessageHandlers.Add(new DefaultHandler());5 }

模型類:

 1 public class TestModel 2 { 3     [JsonProperty(PropertyName ="I")] 4     public long Id { get; set; } 5  6     [JsonProperty(PropertyName = "N")] 7     public string Name { get; set; } 8  9     [JsonProperty(PropertyName = "M")]10     public decimal Money { get; set; }11 12     [JsonProperty(PropertyName = "IE")]13     public bool IsEnable { get; set; }14 15     [JsonProperty(PropertyName = "CD")]16     public DateTime CreateDate { get; set; }17 18     [JsonProperty(PropertyName = "UD")]19     public DateTime? UpdateDate { get; set; }20 }

ApiController:

1 public class DefaultController : ApiController2 {3     [HttpPost]4     public TestModel Find(TestModel model)5     {6         return model;7     }8 }

Request Body:

{"I":10000,"N":"TestModel","M":21547855.0001,"IE":true,"CD":"2015-12-10 12:12:12","UD":"2016-01-01 01:01:01"}

Fiddler4測試:

測試結果:

解決辦法來自:http://stackoverflow.com/questions/27333419/modify-request-content-in-webapi-delegatinghandler


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福利在线免费 | 国产一级aaa全黄毛片 | 色婷婷tv| 欧美aⅴ视频 | 久久久午夜电影 | 日韩黄站 | 91九色福利 | 视频一区二区三区在线观看 | 国产乱淫av片免费 | 亚洲电影在线播放 | 久久超| 精品国产91久久久久久浪潮蜜月 | 亚州综合网 | 久久精品久久久久 | 免费一级特黄毛片 | www亚洲免费 | 日韩视频在线视频 | 成人黄色网战 | 精品影视一区二区 | 一区视频| 91重口视频 | 欧美交在线 | 免费一级片观看 | 激情综合在线 | 久久久久久久久久亚洲 | 少妇一级淫片免费放播放 | 日产精品久久久一区二区福利 | 欧美hdfree性xxxx| www.精品视频 | 欧美在线小视频 | 国产精品视频导航 | 日韩中文字幕一区二区三区 | 色呦呦一区二区三区 | 成人男女啪啪免费观看网站四虎 | 久久国产精品二区 | av日韩在线免费观看 | 欧美a∨一区二区三区久久黄 | 韩国美女一区 | 成人三级免费电影 | 国产精品久久久久久久久久 | 亚洲国产成人久久一区www妖精 |