2017-04-21 72 views
2

一个文本文件我有一个是得到一个字符串的URI .NET核心Web API控制器如下操作它: -阅读和操作与HTTPGET

[HttpGet("/api/TextFileAPI/Get/")] 
    public async Task<JsonResult> Get(string uri) 
    { 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Clear(); 

     var stringTask = await client.GetStringAsync(uri); 

     return Json(stringTask); 
    } 

现在我想为这个创建一个测试,以确保我得到200回复​​,并确保一切正常,但我似乎无法正确传递网址。我的代码目前如下: -

[Test] 
    public async Task Get_EnsureSuccessStatusCode_TextFileAPIController() 
    { 
     var uri = new Uri("http://www.example.com/download/text/textfile1.txt"); 

     var response = await _client.GetAsync(_request + "Get/" + uri); 
     response.EnsureSuccessStatusCode(); 


     Assert.IsTrue(true); 
    } 

这是返回404未找到。如果我将URI更改为普通字符串,我设法进入我的控制器,所以它看起来像URI的格式不正确。

任何人都知道我如何正确传递URI?

感谢您的帮助和时间!

+0

'_request'的值是什么? –

回答

3

uri值作为查询字符串参数传递,而不是将其附加到路径。

var uri = new Uri("http://www.example.com/download/text/textfile1.txt"); 
var response = await _client.GetAsync(_request + "Get?uri=" + uri); 

你为什么把它作为查询字符串参数的原因是因为uri不是路线的一部分。如果您想继续将uri作为路径段,则必须将其添加到路线中。否则,您的网址将不会匹配任何路线。这解释了404 Not Found的来源。

// matches /api/TextFileAPI/Get/http%3A%2F%2Fwww.example.com%2Fdownload%2Ftext%2Ftextfile1.txt 
[HttpGet("/api/TextFileAPI/Get/{uri}")] 

通过这种方法,你必须确保任何前锋在{uri}路径段斜线是URL编码。

var uri = new Uri("http://www.example.com/download/text/textfile1.txt"); 
var response = await _client.GetAsync(_request + "Get/" + WebUtility.UrlEncode(uri.ToString())); 
+0

谢谢Steven,解决了它! – Johann

+0

没问题。我在我的答案中增加了一些更有用的信息。 –

+0

谢谢Steven,这很有道理。感谢您的帮助和时间! – Johann