簡體   English   中英

HttpServer上的第二個請求返回503服務不可用

[英]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)並且根據規范,布爾參數是一個值,值指示此實例是否負責用於配置處理程序。

在我看來不自然的是為什么

  1. 默認行為是處理提供的依賴項。
  2. 默認行為未記錄。

但是,第一個問題是個人觀點,而第二個問題仍可以回答,以確保本主題的完整性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM