Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API版本控制不使用默认版本_C#_Asp.net Web Api_Asp.net Web Api2_Api Versioning - Fatal编程技术网

C# Web API版本控制不使用默认版本

C# Web API版本控制不使用默认版本,c#,asp.net-web-api,asp.net-web-api2,api-versioning,C#,Asp.net Web Api,Asp.net Web Api2,Api Versioning,我创建了一个具有版本控制的web API应用程序。我将使用Microsoft.AspNet.WebApi.Versioning包来实现这一点 Webapi配置: public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services config.AddApiVer

我创建了一个具有版本控制的web API应用程序。我将使用
Microsoft.AspNet.WebApi.Versioning
包来实现这一点

Webapi配置:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.AddApiVersioning(o => {
            o.AssumeDefaultVersionWhenUnspecified = true;
        });
        // Web API routes
        config.MapHttpAttributeRoutes();

    }
}
这里我的假设是,如果我没有通过版本,默认情况下它将选择版本1

控制器代码:

[ApiVersion("1.0")]
[RoutePrefix("api/users")]
public class UserV1Controller : BaseController
{
    public UserV1Controller()
    {
    }

    [Route("all", Name = "UsersCollection")]
    public async Task<IHttpActionResult> GetAll()
    {
        var items = await UnitOfWork.Users.GetPaged(x => x.OrderBy(y => y.Id), 1, 20);
        //Add mapping to DTO 
        return Ok(items);
    }

}
它创建了新的httpconfiguration,而不是使用我们现有的WebAPIConfig类。所以我不知道它可能会影响任何其他功能


因此,如果我将Owin配置为使用webaPI,而不是Global.asax中的GlobalConfiguration.configure(WebApiConfig.Register),它工作正常。

如果您不指定版本,它将被视为未版本。在这种情况下,必须设置未指定时的
AssumeDefaultVersionWhen
属性,如果未指定,则该属性将假定默认版本为
“1.0”
,如果未指定:

config.AddApiVersioning(o => {
    o.AssumeDefaultVersionWhenUnspecified = true;
});

此功能记录在此处:

您可以尝试设置默认版本号,并将中间件配置为在未指定版本号时使用它

参考:


这是一个已确认的错误,只有在普通IIS实现(例如非OWIN)上托管时才会发生。尽管HttpRouteCollection具有索引器,但System.Web定义的HostedHttpRouteCollection不支持它。不是抛出NotSupportedException,而是抛出一个通用的ArgumentOutOfRangeException

有关详细信息,请参阅:


修复程序已在中,现在可以在包版本中使用。

否。如果我明确提供api版本,我可以访问。我还尝试了文档中指定的相同示例,但出现了相同的错误。任何其他配置?我的错,请用路线配置编辑您的问题。我可以通过在操作方法上添加
[Route]
装饰器来重新创建您的错误。您的问题中仍然缺少路由配置。我添加了Route.config文件代码。由于这只是API,我认为我们不关心route.config。对的我只关心webApiConfig文件现在我更新了我的最新发现。但我不知道为什么会这样,这是mvc的路由配置。我们需要您的webapi的路由配置。如果不是changedok,则最有可能位于WebApiConfig.cs中。所以只有我感到困惑。实际上,我删除了默认的路由线,因为我只为属性路由进行了配置。我现在更新了。对不起,我把你弄糊涂了。没关系。您的路线配置似乎还可以。我现在可以安全地重现你的错误了。现在让我们为itok找到一个解决方案,谢谢。我尝试了所有指定的方法。如果没有得到任何东西,就像是继续扩展ControllerSelectorIs有没有使用版本2的控制器,它有相同的routeprefix?e、 g.
[RoutePrefix(“api/用户”)]
?因为这会导致你在我的本地项目中出错。如果我删除第二个控制器或其routeprefix,错误就会消失。这是很自然的,因为两个不同的控制器不能有两个相同的路由。这不起作用,因为他的路由不使用日期时间作为版本属性。合适的重载应该是
新的ApiVersion(1,0)
谢谢。但这不是问题所在。我认为这与路线有关。当我仅使用RoutePrefix和Route属性时,此问题再次出现。我是说汉克斯。在版本3.0.1中按预期工作
config.AddApiVersioning(o => {
    o.AssumeDefaultVersionWhenUnspecified = true;
});
services.AddApiVersioning(
    o =>
    {
        o.AssumeDefaultVersionWhenUnspecified = true );
        o.DefaultApiVersion = new ApiVersion("1.0");
    } );