2017-04-21 94 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