Microsoft.AspNet.WebApi 5.2.7 Проблема маршрутизации - PullRequest
0 голосов
/ 01 февраля 2019

Мы использовали Microsoft.AspNet.WebApi 5.2.3 в нашем проекте, и мы недавно обновились до 5.2.7, и некоторые из существующих функций перестали работать:

У меня есть FileController:

[ApiVersion("1")]
[RoutePrefix("api/v{version:apiVersion}/file")]
public class FileController : BaseController
{
    [HttpPost]
    [MapToApiVersion("1")]
    [Route("uploadmethod"), Obsolete("The action is marked as obsolete for missing the support for userId. Please use uploadmethod from version 2.")]
    public async Task<HttpResponseMessage> UploadFileStream([FromUri] string filePath = null...)
    {

    }
}

А затем еще один контроллер, который выводится из приведенного выше:

[ApiVersion("2")]
[RoutePrefix("api/v{version:apiVersion}/file")]
public class FileController : Controllers.FileController
{
    [HttpPost]
    [MapToApiVersion("2")]
    [Route("uploadmethod")]
    public async Task<HttpResponseMessage> UploadFileWithUserId([FromUri] string userId = null, [FromUri] string filePath = null)
    {
       //at some point here I call an internal method from the base FileController
    }
}

При использовании 5.2.3 следующий код работал нормально:

$"api/v1/file/uploadmethod?filePath={path}";

Теперь, послепри обновлении до 5.2.7 я получаю эту ошибку: "Обнаружено несколько типов контроллеров, соответствующих URL-адресу. Это может произойти, если маршруты атрибутов на нескольких контроллерах соответствуют запрошенному URL-адресу."

Iнужен атрибут MapToApiVersion, потому что мне нужно проверить ниже для успеха.

    [Fact]
    public async Task UploadFileUsingVersion2NUserId_WillThrowError_MethodsIsMissingOnThatVersion()
    {       
            //...
            var url = $"api/v2/file/uploadmethod?filePath={path}";

            // When
            var response = await api.UploadFile(url, content);

            // Then
            Assert.Equal(HttpStatusCode.MethodNotAllowed, response.StatusCode);
            var errorResponse = await response.Content.ReadAsJsonAsync<UnsupportedVersionResponse>();
            Assert.Equal("UnsupportedApiVersion", errorResponse.Error.Code);
    }

Что изменилось?Как я могу применить v1 только для базового контроллера?

...