[英]Second request on HttpServer returns 503 Service Unavailable
我有以下設置:
1)API測試的基類
public class BaseApiTest
{
private static readonly Uri BaseUri = new Uri("http://localhost");
private static HttpServer _server;
internal BaseApiTest()
{
var config = new HttpConfiguration
{
IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always
};
WebApiConfig.Register(config);
_server = new HttpServer(config);
}
~BaseApiTest()
{
_server.Dispose();
}
protected static HttpResponseMessage GetHttpResponseMessageFrom(HttpMethod method, string relativeUri)
{
using (var client = new HttpMessageInvoker(_server))
{
var absoluteUri = new Uri(BaseUri, relativeUri);
var message = new HttpRequestMessage(method, absoluteUri);
var response = client.SendAsync(message, CancellationToken.None);
return response.Result;
}
}
2)我要測試的每個控制器的類的擴展:
[TestClass]
public class ChemicalApiTest : BaseApiTest
{
private const string ControllerRoutePrefix = "/api/customers/316";
[TestMethod]
public void SomeTest() {
// Act
var response =
GetHttpResponseMessageFrom(HttpMethod.Get, ControllerRoutePrefix + "/suppliers");
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); // this is OK
response =
GetHttpResponseMessageFrom(HttpMethod.Get, ControllerRoutePrefix + "/suppliers");
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); // This fails with 503
}
}
因此,我想http服務器僅響應第一個查詢。 為什么會這樣,如何解決它,以及我怎么知道(在文檔的任何地方都看不到)
編輯
原來,問題出在兩次實例化客戶端HttpMessageInvoker
。 如果我像下面的代碼片段一樣重構BasiApiTest
類,它可以正常工作。 但是,我仍然對我的問題感興趣。
public class BaseApiTest
{
private static readonly Uri BaseUri = new Uri("http://localhost");
private static HttpMessageInvoker _client;
internal BaseApiTest()
{
var config = new HttpConfiguration
{
IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always
};
WebApiConfig.Register(config);
var server = new HttpServer(config);
_client = new HttpMessageInvoker(server);
}
~BaseApiTest()
{
_client.Dispose();
}
protected static HttpResponseMessage GetHttpResponseMessageFrom(HttpMethod method, string relativeUri)
{
var absoluteUri = new Uri(BaseUri, relativeUri);
var message = new HttpRequestMessage(method, absoluteUri);
var response = _client.SendAsync(message, CancellationToken.None);
return response.Result;
}
}
事實證明HttpMessageInvoker
類具有2個構造函數:
HttpMessageInvoker(HttpMessageHandler);
HttpMessageInvoker(HttpMessageHandler, Boolean);
第一個鏈接到具有true
值的第二個鏈接,因此在我的情況下,調用new HttpMessageInvoker(server)
等同於new HttpMessageInvoker(server, true)
並且根據規范,布爾參數是一個值,該值指示此實例是否負責用於配置處理程序。
在我看來不自然的是為什么
但是,第一個問題是個人觀點,而第二個問題仍可以回答,以確保本主題的完整性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.