2017-09-27 30 views
4

我在控制器后的方法是这样的:发帖为通过招摇/邮递员串网页API路径越来越空

public IActionResult Post([FromBody]string directoryPath) 
{ 
     _log.Debug($"Got ScanDirectory request for directoryPath:{directoryPath}"); 
     if (string.IsNullOrEmpty(directoryPath)) 
     { 
      return NotFound("DirectoryPath is empty"); 
     } 
} 

当我操作的方式从招摇/邮差后与机身串"test"其工作罚款和directoryPath得到了测试字符串,但是当我发布像这样的路径:"C:\Users\futerm\Downloads\test"我在directoryPath null。

为什么我不能张贴与路径我在内部招摇?

回答

3

你用Content-Type: application/json做了请求,所以正文中的字符串被当作JSON字符串处理。并且JSON字符串必须用双引号引起来,并且使用\字符(specification)应该转义特殊字符。

所以你应该发布路径为"C:\\Users\\futerm\\Downloads\\test"


如果你不想做的字符转义,然后再考虑做一个请求与Content-Type: text/plain。但是,您需要修改代码以直接从请求正文中读取。

控制器操作。

[HttpPost] 
    public async Task<IActionResult> Post() 
    { 
     var directoryPath = await Request.GetRawBodyStringAsync(); 
     //_log.Debug($"Got ScanDirectory request for directoryPath:{directoryPath}"); 
     if (string.IsNullOrEmpty(directoryPath)) 
     { 
      return NotFound("DirectoryPath is empty"); 
     } 

     return Ok(directoryPath); 
    } 

Helper方法:

public static class HttpRequestExtensions 
{ 

    /// <summary> 
    /// Retrieve the raw body as a string from the Request.Body stream 
    /// </summary> 
    /// <param name="request">Request instance to apply to</param> 
    /// <param name="encoding">Optional - Encoding, defaults to UTF8</param> 
    /// <returns></returns> 
    public static async Task<string> GetRawBodyStringAsync(this Microsoft.AspNetCore.Http.HttpRequest request, System.Text.Encoding encoding = null) 
    { 
     if (encoding == null) 
      encoding = System.Text.Encoding.UTF8; 

     using (var reader = new System.IO.StreamReader(request.Body, encoding)) 
      return await reader.ReadToEndAsync(); 
    } 
} 

以上的扩展方法主要是采取从Accepting Raw Request Body Content文章。