小编rhe*_*one的帖子

MVC.ApiExplorer未发现的有效路由

使用ASP.NET Web API帮助页面和相关的MVC.ApiExplorer时,我有可通过http访问但ApiExplorer未发现的有效路由.仅当使用常规路由规则时才会找到这些路由.使用更具体的规则(与普通规则一起)似乎隐藏了来自ApiExplorer的路线.

在三个规则的示例情况下,两个路由涉及GET,而控制器方法上的POST动作不采用查询参数进行MIA.

public class SomeControllerController : ApiController
{
    [HttpPost] public HttpResponseMessage Post(PostObject value) { ... }
    [HttpGet] public IEnumerable<DisplayObject> GetAll() { ... }
    [HttpGet] public DisplayObject GetById(string id) { ... }
}
Run Code Online (Sandbox Code Playgroud)

使用路由规则时

routes.MapHttpRoute(
    name: "ApiDefault",
    routeTemplate: "api/{controller}/{id}",
    defaults: new
              {
                  id = RouteParameter.Optional
              }
    );
Run Code Online (Sandbox Code Playgroud)

这些路线由Api Explorer适当地发现

  • POST:api/SomeController
  • GET:api/SomeController
  • GET:api/SomeController/{id}

然而,在添加不太通用且更有意义的规则时

routes.MapHttpRoute(
    name: "ApiSomeControllerDefault",
    routeTemplate: "api/somecontroller/{id}",
    defaults: new
              {
                controller = "SomeController",
                id = RouteParameter.Optional
              }
    );

routes.MapHttpRoute(
    name: "ApiDefault",
    routeTemplate: "api/{controller}/{id}",
    defaults: …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc asp.net-mvc-routing asp.net-web-api asp.net-mvc-apiexplorer

9
推荐指数
2
解决办法
2925
查看次数

如何使用适合导入的WebApi HelpPages从WebApi2项目生成JSON Postman集合

Postman是一种可用于轻松测试宁静Web服务的工具.

如果Asp.Net项目将WebApiWebApi Helppages结合使用,则可以为暴露的restful Web服务自动生成文档.

这个自动生成的文档很好,但可以通过增加的可访问性使其更好.

如何组合这些技术技术来生成可以在Postman中导入的JSON文件?

c# asp.net-web-api asp.net-web-api-helppages asp.net-web-api2 postman

9
推荐指数
2
解决办法
1万
查看次数

对于某些方法,基于属性的webapi2路由返回404

我目前正在开发一个已从Webapi升级到Webapi2的项目.部分转换包括切换到使用基于属性的路由.

我在Global.asax中设置了我的路线(如下)

 GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());
Run Code Online (Sandbox Code Playgroud)

并删除了以前的路由配置.

我使用适当的System.Web.Http.RouteAttributeSystem.Web.Http.RoutePrefixAttribute属性装饰了所有API控制器.

如果我使用调试器检查System.Web.Http.GlobalConfiguration.Configuration.Routes,我可以看到所有我期望的路由都在集合中注册.同样,所包含的生成的Webapi帮助页面文档中也提供了适当的路径.

即使所有似乎都设置正确,我的REST调用数量也会导致服务器发现404未找到响应.

我发现了一些与GE​​T方法相关的显着相似之处(这是迄今为止我测试的所有内容)

  • 如果方法接受0参数,它将失败
  • 如果路由覆盖前缀,则会失败
  • 如果方法采用字符串参数,则可能会成功
  • 返回类型似乎没有影响
  • 命名路线似乎没有任何影响
  • 订购路线似乎没有任何影响
  • 重命名基础方法似乎没有任何影响

值得注意的是,我的API控制器出现在一个单独的区域,但考虑到某些路由可行,我不认为这是手头的问题.

非功能方法调用的示例

[RoutePrefix("api/postman")]
public class PostmanApiController : ApiController
{
    ...
    [HttpGet]
    [Route("all", Name = "GetPostmanCollection")]
    [ResponseType(typeof (PostmanCollectionGet))]
    public IHttpActionResult GetPostmanCollection()
    {
        return Ok(...);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以通过 http://[application-root]/api/postman/all

有趣的是打电话给

Url.Link("GetPostmanCollection", null)
Run Code Online (Sandbox Code Playgroud)

将返回上述预期的网址

一个非常类似的方法调用示例在同一个控制器中调用,其中一些工作,一些不工作.

[RoutePrefix("api/machine")]
public class MachineApiController : ApiController
{
    ...
    [HttpGet]
    [Route("byowner/{owner}", Name = "GetPostmanCollection")]
    public IEnumerable<string> GetByOwner([FromUri] …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api asp.net-web-api-routing asp.net-web-api2

8
推荐指数
2
解决办法
8280
查看次数

将 ISchemaFilter 示例转换为 Swashbuckle 5.0

在 Swashbuckle 5 之前,可以定义和注册一个ISchemaFilter可以提供模型的示例实现:

public class MyModelExampleSchemaFilter : ISchemaFilter
{
    public void Apply(Schema schema, SchemaFilterContext context)
    {
        if (context.SystemType.IsAssignableFrom(typeof(MyModel)))
        {
            schema.Example = new MyModel
            {
                Name = "model name",
                value = 42
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所述Schema.Example将采取的任意对象,并且生成的OpenAPI模式时它会适当地串行化。

但是,随着迁移到 .NET Core 3 和 Swashbuckle 5,该Schema.Example属性不再是 anobject并且需要类型Microsoft.OpenApi.Any.IOpenApiAny。似乎没有关于如何提供新示例的文件记录路径。

我已经尝试基于查看 中的代码Microsoft.OpenApi来构建我自己的 an 实现,IOpenApiAny但是任何尝试使用它来生成示例的尝试都Microsoft.OpenApi.Writers.OpenApiWriterAnyExtensions.WriteObject(IOpenApiWriter writer, OpenApiObject entity)Write调用其方法之前从内部失败。我并不声称下面的代码是完全正确的,但我希望它至少能照亮一条路径以及如何前进。

/// <summary>
///     A class that recursively adapts a unidirectional …
Run Code Online (Sandbox Code Playgroud)

c# swashbuckle openapi asp.net-core-3.0 .net-core-3.0

7
推荐指数
1
解决办法
1761
查看次数

检索关闭泛型类型的非闭包类型的泛型类型

我有一个问题(可能是由于我对C#泛型缺乏熟悉)来获取非封闭类型的泛型.除了正在使用的显式验证器接口之外,我有几个看起来与以下内容非常类似的方法.

public IEnumerable<IDeleteValidator<T>> GetDeleteValidators<T>()
{
    var validatorList = new List<IDeleteValidator<T>>();
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T)))
    {
        var validatorType = typeof(IDeleteValidator<>).MakeGenericType(type);
        var validators = ObjectFactory
            .GetAllInstances(validatorType).Cast<IDeleteValidator<T>>();
        validatorList.AddRange(validators);
    }
    return validatorList;
}
Run Code Online (Sandbox Code Playgroud)

方法GetRecursiveBaseTypesAndInterfaces按照说法执行,并收集给定类型的所有基类型和接口.所以我最终要做的是获取显式验证器接口的未闭合类型,并在每个原始类型T的基类和接口上将其类型关闭.这很好用,但是我想清理我的代码并以比上面更通用的形式完成它

知道T的任何验证器将扩展IValidator(如下)

public interface IDeleteValidator<in T> : IValidator<T> {}
Run Code Online (Sandbox Code Playgroud)

我对上述方法的泛型版本的未完成尝试如下:

public IEnumerable<TValidator> GetValidators<T, TValidator>() 
    where TValidator : IValidator<T>
{
    var validatorList = new List<TValidator>();
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T)))
    {
        var unclosedType = ???
        var validatorType = typeof(unclosedType).MakeGenericType(type);
        var validators = ObjectFactory
            .GetAllInstances(validatorType).Cast<TValidator>();
        validatorList.AddRange(validators);
    }
    return validatorList;
} …
Run Code Online (Sandbox Code Playgroud)

c# generics generic-programming

6
推荐指数
1
解决办法
158
查看次数

NETiber DI处理的NHibernate SessionFactory

试图将NHibernate SessionFactory设置为单例,将Session设置为作用域,所有这些都由.NET Core依赖项注入处理。我在Startup.cs中配置了这些代码:

services.AddSingleton<NHibernate.ISessionFactory>(factory =>
{
    return Fluently
                .Configure()
                .Database(() =>
                {

                    return FluentNHibernate.Cfg.Db.MsSqlConfiguration
                            .MsSql2012
                            .ShowSql()
                            .ConnectionString(ConnectionString);
                })
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Model>())
                .BuildSessionFactory();
}); 

services.AddScoped<NHibernate.ISession>(factory =>
   factory
        .GetServices<NHibernate.ISessionFactory>()
        .First()
        .OpenSession()
);
Run Code Online (Sandbox Code Playgroud)

我的问题是-例如,如何在存储库类中准确传递Session或SessionFactory实例?

c# nhibernate asp.net-core

6
推荐指数
1
解决办法
2608
查看次数

使用yield return处理Enumerable对象的正确模式是什么?

是否存在返回Enumerable中所有项的yield的标准模式?

我经常发现我的一些代码反映了以下模式:

    public IEnumerable<object> YieldReturningFunction()
    {

        ...
        [logic and various standard yield return]
        ...

        foreach(object obj in methodReturningEnumerable(x,y,z))
        {
            yield return obj;
        }

    }
Run Code Online (Sandbox Code Playgroud)

foreach循环的显式用法仅仅是为了向我返回可枚举的代码味​​道的结果.

显然,我可以放弃使用yield return来增加代码的复杂性,方法是显式构建一个Enumerable并将每个标准yield return的结果添加到它中,并添加methodReturningEnumerable结果的范围.这将是不幸的,因此我希望有一种更好的方法来管理收益率回报模式.

c# ienumerable design-patterns yield-return

5
推荐指数
1
解决办法
262
查看次数

使用ASP.NET Web Optimization和BundleTransformer来正确使用IItemTransform来纠正CSS捆绑中的路径是什么?

我目前正在开发一个项目,该项目使用ASP.NET Web Optimization库(v 1.1.0-Beta1)和Bundle Transformer扩展(v 1.7.3-Beta1用于核心,1.7.0-Beta1用于LESS)用于将LESS转换为CSS.基于Web搜索,CSS(及更少)中的路径似乎是一个常见问题,在大多数情况下,建议手动修改CSS并完成它.但是,由于我们的开发和生产环境之间的差异,并且没有拥有受影响的CSS,这样的解决方案是不可行的.

似乎存在两种解决方案.第一种是将捆绑定义的虚拟目录覆盖在包含内容的实际目录上.对我来说,这似乎是一个糟糕的选择.

其次,我选择的路线是使用IItemTransform这样的CssRewriteUrlTransform(在这篇文章中提到.即使这个解决方案也有它的局限性.因此我试图编写自己的ItemTransformer但是看起来它的执行结果被忽略了以下列方式使用时:

public static void RegisterBundles(BundleCollection bundles)
{
    /* among other work pass in IItemTransformer to fix paths */
    var styleBundle = new StyleBundle("~/bundles/css/styles")
        .Include(...)
        .Include("~/Content/less/font-awesome.less", new RewriteUrlTransform())
        .Include(...);

    styleBundle.Transforms.Add(new CssTransformer());
    styleBundle.Orderer = new NullOrderer();

    bundles.Add(styleBundle);
}
Run Code Online (Sandbox Code Playgroud)

IItemTransform的实现:

public class RewriteUrlTransform : IItemTransform
{
    public string Process(string includedVirtualPath, string input)
    {
        return (input manipulated with proper path replacing …
Run Code Online (Sandbox Code Playgroud)

web-optimization asp.net-mvc-4 bundling-and-minification asp.net-optimization bundletransformer

5
推荐指数
1
解决办法
4101
查看次数

在Javascript事件中捕获特殊键和键案例

我一直在使用Javascript密钥事件(keyup,keydown,keypress)做一些工作,并得出结论,在尝试确定用户按下了哪些密钥时,每个都有其优点和缺点.

通过使用jQuery提供的event.which,似乎onkeypress将提供区分大小写的字符代码.即AZ为65-90,az为97-122.但是,方向等特殊键不会触发onkeypress.但它们会触发keyup/*keydown*,但这些不会提供区分大小写的代码.

是否存在"两全其美"的解决方案,既可以提供区分大小写检测,又可以提供特殊的密钥检测,而不需要手动同时监控多个事件?

javascript jquery keycode

5
推荐指数
1
解决办法
317
查看次数

如何从SVG文件批量创建Windows中的图标webfonts

在过去,我使用了Font CustomIcoMoon等工具来创建webfonts,用于各种Web应用程序,就像使用Font Awesome一样.

但是似乎没有一种解决方案可以在Windows下本地运行.Font Custom依赖于Windows上不可用的库,而IcoMoon不提供批处理/本地处理方式.

有没有一种在Windows上执行此操作的好方法,或者还没有解决方案?

如果可以通过Grunt或Visual Studio构建步骤完成,则可以获得奖励积分.

windows fonts svg typography webfonts

5
推荐指数
1
解决办法
800
查看次数

从隐含的无符号十六进制字符串构造 BigInteger 的正确方法是什么?

我遇到了一个问题,因为我有一个隐含的无符号十六进制数作为字符串,由用户输入提供,需要转换为BigInteger.

由于BigInteger设置了最高阶位 (0x8 / 1000b) 的任何输入的有符号性质,结果数字被视为负数。然而,这个问题不能通过简单地检查符号位并乘以 -1 或由于不尊重基础符号的补码获得绝对值来解决,例如将所有值 0xF* 视为 -1。

以下是一些示例输入/输出

var style = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier;


BigInteger.TryParse("6", style) == 6   // 0110 bin
BigInteger.TryParse("8", style) == -8  // 1000 bin
BigInteger.TryParse("9", style) == -7  // 1001 bin
BigInteger.TryParse("A", style) == -6  // 1010 bin
...
BigInteger.TryParse("F", style) == -1  // 1111 bin
...
BigInteger.TryParse("FA", style) == -6 // 1111 1010 bin
BigInteger.TryParse("FF", style) == -1 // 1111 1111 bin
...
BigInteger.TryParse("FFFF", style) == -1 …
Run Code Online (Sandbox Code Playgroud)

c# hex biginteger ones-complement

5
推荐指数
1
解决办法
341
查看次数

使用开放泛型自动映射并在 ForMember 语句中包含源

我最近从 Automapper 4.2.1 升级到 5.1.1,并且在使用涉及开放泛型的先前有效映射时遇到问题。

以前,在 automapper 配置中,我有以下打开的通用映射配置

CreateMap(typeof(IPager<>), typeof(ModelPager<>))
    .ForMember("Items", e => e.MapFrom(o => (IEnumerable) o));
Run Code Online (Sandbox Code Playgroud)

这在 Automapper 4 中有效,但在InvalidOperaionException尝试通过IMapper.Map<TDestination>(source). 执行Items ForMember操作的映射时似乎失败,异常消息为“ Sequence contains no matching element

这反映在示例实现代码下面 IPager<TSource>器具IEnumerable<TSource>,以及Items财产ModelPager<TDestination>IEnumerable<TDestination>如此铸造应该是有效的。并且存在每个TSource到的有效映射TDestination

CreateMap<TSource, TDestination>();
Run Code Online (Sandbox Code Playgroud)

网页界面

public interface IPager<out TItem> : IEnumerable<TItem>
{
    int CurrentPage { get; }

    int PageCount { get; }

    int PageSize { get; }

    int TotalItems { get; } …
Run Code Online (Sandbox Code Playgroud)

generics automapper open-generics automapper-5

5
推荐指数
1
解决办法
1186
查看次数

如何为封闭的泛型的闭包类型的完整层次结构解析所有服务类型

我最近开始使用,从迁移。使用以前的依赖项注入工具,解决在给定类型的完整层次结构(所有接口和基类)上关闭的所有服务似乎微不足道。

例如structuremap / lamar只需扫描即可

// ... registry stuff...
Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();
            scan.ConnectImplementationsToTypesClosing(typeof(IAnimalFeeder<>));
        });
Run Code Online (Sandbox Code Playgroud)

和分辨率只是一个呼吁的事情GetAllInstancescontext

var openFeederType = typeof(IAnimalFeeder<>);
var animalType = typeof(animal);
var closedType = openFeederType.MakeGenericType(animalType);

var feeders = context.GetAllInstances(closedType)   // resolve all feeders for given animal hierarchy
Run Code Online (Sandbox Code Playgroud)

但是,autofac似乎并非如此。除非我缺少一些文档和理解不当的方法,否则看来我需要跳过许多反射调用才能手动确定我的服务类型的类型层次结构,在每个发现的类型上关闭泛型,然后在打开时关闭该泛型。在IEnumerable最后进行Resolve的每个封闭通话IEnumerable

接下来是我的方法,我想确保它是有效的并且不重新实现现有功能

给出我们最喜欢的多态动物示例

public interface IAnimal { }
public class Dog : AbstractAnimal { }
public class Wolf …
Run Code Online (Sandbox Code Playgroud)

c# generics dependency-injection autofac open-generics

5
推荐指数
0
解决办法
74
查看次数