Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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
OpenRasta:Uri似乎与处理程序选择无关_Openrasta - Fatal编程技术网

OpenRasta:Uri似乎与处理程序选择无关

OpenRasta:Uri似乎与处理程序选择无关,openrasta,Openrasta,当为同一类型但使用不同uri注册两个处理程序时,处理程序选择算法在确定要使用哪个处理程序时似乎不会检查uri 如果运行下面的程序,您会注意到只有HandlerOne会被调用(两次)。不管我是要一个还是两个,后者应该由HandlerTwo来处理 我是做错了什么,还是需要在OpenRasta中修复?(我正在使用2.0.3.0 btw) 更新 我有一种感觉,我可以像上面所描述的那样使用UrainMeHandlerMethodSelector实现我想要的类似功能,但接下来我必须对每个处理程序方法进行注释

当为同一类型但使用不同uri注册两个处理程序时,处理程序选择算法在确定要使用哪个处理程序时似乎不会检查uri

如果运行下面的程序,您会注意到只有HandlerOne会被调用(两次)。不管我是要一个还是两个,后者应该由HandlerTwo来处理

我是做错了什么,还是需要在OpenRasta中修复?(我正在使用2.0.3.0 btw)

更新
我有一种感觉,我可以像上面所描述的那样使用UrainMeHandlerMethodSelector实现我想要的类似功能,但接下来我必须对每个处理程序方法进行注释,并执行AtUri().Named(),这在我看来就像样板,我希望避免这种情况。是不是用(Y)处理了X和Y之间的连接?

我给OpenRasta打了补丁,让它正常工作。这些是我接触过的文件:

OpenRasta/Configuration/MetaModel/Handlers/HandlerMetaModelHandler.cs
OpenRasta/Handlers/HandlerRepository.cs
OpenRasta/Handlers/IHandlerRepository.cs
OpenRasta/Pipeline/Contributors/HandlerResolverContributor.cs
主要的变化是,现在处理程序存储库在对AddResourceHandler的初始化调用中获取注册的URI,因此,当稍后在处理程序选择期间调用GetHandlerTypesFor时,它还可以检查URI。界面方面,我改变了这一点:

public interface IHandlerRepository
{
    void AddResourceHandler(object resourceKey, IType handlerType);
    IEnumerable<IType> GetHandlerTypesFor(object resourceKey);
公共接口IHandlerRepository
{
void AddResourceHandler(对象resourceKey,IType handlerType);
IEnumerable GetHandlerTypesFor(对象资源键);
为此:

public interface IHandlerRepository
{
    void AddResourceHandler(object resourceKey, IList<UriModel> resourceUris, IType handlerType);
    IEnumerable<IType> GetHandlerTypesFor(object resourceKey, UriRegistration selectedResource);
公共接口IHandlerRepository
{
void AddResourceHandler(对象resourceKey、IList ResourceURI、IType handlerType);
IEnumerable GetHandlerTypes for(对象资源键,UriRegistration selectedResource);
为了简洁起见,我将省略实现

此更改还意味着OpenRasta不会浪费时间进一步检查与当前请求无关的处理程序(其方法签名等)

如果可能的话,我仍然想在这个问题上得到其他的意见。也许我只是错过了一些东西。

尤金

您不应该在同一资源类型上有多个这样的注册,并且您可能永远不需要将
ResourcesOfType
与URI关联,这将完全破坏OpenRasta中使用的解析算法

如果要映射两个不同的东西,请创建两个资源类。处理程序和URI仅按资源类关联,如果在设计资源时失败,OpenRasta将无法匹配这两个,这是按设计进行的

如果您想沿着这条路线继续下去,而我真的认为您不应该这样做,那么您可以注册各种URI来拥有一个名称,并在每个方法上提示应该使用
HttpOperation(ForUriName=blah)来处理该名称
。这项功能仅适用于那些非常罕见的场景,您确实需要选择退出自动方法解析


最后,由于OpenRasta是一个可编译的框架,您不必去破解现有的类,您应该将自己插入到框架中,以确保覆盖您不想要的组件,并用您自己编写的代码替换它们。在这种情况下,您只需编写一个贡献者来替换您选择的处理程序如果您不喜欢默认值,并且希望使用MVC样式的选择系统,则可以使用moel。或者,如果您希望选择某些方法而不是其他方法,则可以删除现有的操作选择器并替换它们(或使用您自己的。这样,您将依赖已发布的API来扩展OpenRasta,并且您的代码在将来不会被破坏。如果您分叉并黑客攻击现有代码,我不能保证这一点。

正如Seb所解释的,当您注册具有相同资源类型的多个处理程序时,OpenRasta将处理程序视为一个大型连接类。因此猜测(最好的描述方式)执行哪个潜在的GET(或其他HTTP动词)方法,它认为哪个是最合适的。这是潜在开发人员无法接受的,必须解决

在使用OpenRasta时,我需要能够向多个处理程序注册相同的资源类型。从规范化良好的关系数据库检索数据时,您一定会从多个请求中获得相同类型的响应。这在创建多个查询时发生(在Linq中)从一对多关系的任一侧检索数据,这对数据库的整个结构来说当然很重要

我接受了Seb的建议,并希望我正确地实现了他的建议,我采用了数据库模型类,并在资源命名空间中为可能引入重复资源类型的每个实例构建了一个派生类

ResourceSpace.Has.ResourcesOfType<IList<Client>>()
                .AtUri("/clients").And
                .AtUri("/client/{clientid}").HandledBy<ClientsHandler>().AsJsonDataContract();

ResourceSpace.Has.ResourcesOfType<IList<AgencyClient>>()
                .AtUri("/agencyclients").And
                .AtUri("/agencyclients/{agencyid}").HandledBy<AgencyClientsHandler>().AsJsonDataContract();
您甚至不需要将从Linq SQL数据访问层接收到的基类强制转换为派生类。Linq强制转换方法并不适用于此类情况,尽管此代码将编译它,但它是错误的,并且您将收到运行时异常“Linq to Entities仅支持强制转换实体数据模型基元类型”

Context.Set<Client>().Cast<AgencyClient>().ToList();  //will receive a runtime error
Context.Set().Cast

使用AS运算符将再次编译,甚至运行,但在返回的列表中会给出一个null值,因此不会检索到预期的数据

Context.Set<Client>().ToList() as IEnumerable<AgencyClient>; //will compile and run but will return null
Context.Set().ToList()作为IEnumerable;//将编译并运行,但将返回null
我仍然不明白OpenRasta是如何处理从处理程序到ResourceType的不同返回类的,但确实如此,所以让我们好好利用它。也许Seb可以详细说明一下


因此,OpenRasta单独处理这些类,并为URI执行正确的处理程序方法。

这不是我将要使用的修补程序。OpenRasta中有一个严格的原则,您将一个或多个URI和一个或多个处理程序关联到一个资源类型。关闭URI不用于处理程序选择的行为是故意的,to防止你试图
Context.Set<Client>().Cast<AgencyClient>().ToList();  //will receive a runtime error
Context.Set<Client>().ToList() as IEnumerable<AgencyClient>; //will compile and run but will return null