使用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适当地发现
然而,在添加不太通用且更有意义的规则时
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
Postman是一种可用于轻松测试宁静Web服务的工具.
如果Asp.Net项目将WebApi与WebApi Helppages结合使用,则可以为暴露的restful Web服务自动生成文档.
这个自动生成的文档很好,但可以通过增加的可访问性使其更好.
如何组合这些技术技术来生成可以在Postman中导入的JSON文件?
c# asp.net-web-api asp.net-web-api-helppages asp.net-web-api2 postman
我目前正在开发一个已从Webapi升级到Webapi2的项目.部分转换包括切换到使用基于属性的路由.
我在Global.asax中设置了我的路线(如下)
GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());
Run Code Online (Sandbox Code Playgroud)
并删除了以前的路由配置.
我使用适当的System.Web.Http.RouteAttribute和System.Web.Http.RoutePrefixAttribute属性装饰了所有API控制器.
如果我使用调试器检查System.Web.Http.GlobalConfiguration.Configuration.Routes,我可以看到所有我期望的路由都在集合中注册.同样,所包含的生成的Webapi帮助页面文档中也提供了适当的路径.
即使所有似乎都设置正确,我的REST调用数量也会导致服务器发现404未找到响应.
我发现了一些与GET方法相关的显着相似之处(这是迄今为止我测试的所有内容)
值得注意的是,我的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) 在 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#泛型缺乏熟悉)来获取非封闭类型的泛型.除了正在使用的显式验证器接口之外,我有几个看起来与以下内容非常类似的方法.
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) 试图将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实例?
是否存在返回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结果的范围.这将是不幸的,因此我希望有一种更好的方法来管理收益率回报模式.
我目前正在开发一个项目,该项目使用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
我一直在使用Javascript密钥事件(keyup,keydown,keypress)做一些工作,并得出结论,在尝试确定用户按下了哪些密钥时,每个都有其优点和缺点.
通过使用jQuery提供的event.which,似乎onkeypress将提供区分大小写的字符代码.即AZ为65-90,az为97-122.但是,方向等特殊键不会触发onkeypress.但它们会触发keyup/*keydown*,但这些不会提供区分大小写的代码.
是否存在"两全其美"的解决方案,既可以提供区分大小写检测,又可以提供特殊的密钥检测,而不需要手动同时监控多个事件?
在过去,我使用了Font Custom和IcoMoon等工具来创建webfonts,用于各种Web应用程序,就像使用Font Awesome一样.
但是似乎没有一种解决方案可以在Windows下本地运行.Font Custom依赖于Windows上不可用的库,而IcoMoon不提供批处理/本地处理方式.
有没有一种在Windows上执行此操作的好方法,或者还没有解决方案?
如果可以通过Grunt或Visual Studio构建步骤完成,则可以获得奖励积分.
我遇到了一个问题,因为我有一个隐含的无符号十六进制数作为字符串,由用户输入提供,需要转换为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) 我最近从 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) 我最近开始使用autofac,从structuremap和lamar迁移。使用以前的依赖项注入工具,解决在给定类型的完整层次结构(所有接口和基类)上关闭的所有服务似乎微不足道。
例如structuremap / lamar只需扫描即可
// ... registry stuff...
Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.ConnectImplementationsToTypesClosing(typeof(IAnimalFeeder<>));
});
Run Code Online (Sandbox Code Playgroud)
和分辨率只是一个呼吁的事情GetAllInstances
上context
:
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# ×8
generics ×3
asp.net-core ×1
asp.net-mvc ×1
autofac ×1
automapper ×1
automapper-5 ×1
biginteger ×1
fonts ×1
hex ×1
ienumerable ×1
javascript ×1
jquery ×1
keycode ×1
nhibernate ×1
openapi ×1
postman ×1
svg ×1
swashbuckle ×1
typography ×1
webfonts ×1
windows ×1
yield-return ×1