2011-02-25 50 views
1

我有一个网站在iis7承载几个openrasta应用程序作为虚拟目录。其中一个openrasta应用程序托管一个资源,所以我希望它在该虚拟目录的根目录下运行。我能够成功获取资源,但无法发布资源。当发布时,我得到了一个405错误。Openrasta张贴到资源在基地uri

本地,它看起来像:

 
http://localhost/OpenRastaApp1/Resource1 
http://localhost/OpenRastaApp1/Resource2 
http://localhost/OpenRastaApp2/Resource3 
http://localhost/OpenRastaApp2/Resource4 

我要添加其他应用程序,但这个程序将只包含1个资源我希望通过应用程序的基础URI来访问它。即

 
http://localhost/OpenRastaApp3 not http://localhost/OpenRastaApp3/Resource5 

我能够GET资源5,但无法使用以下配置发布到它。

它不应该与模板“/ {id}”匹配,因为我在发布时不包含ID。

我的配置如下:

ResourceSpace.Has 
    .ResourcesOfType<ThingResource>() 
    .AtUri("/").And 
    .AtUri("/{id}") 
    .HandledBy<ThingHandler>() 
    .AsJsonDataContract(); 

我的处理程序代码是:

public class ThingHandler 
{ 
    [HttpOperation(HttpMethod.POST)] 
    public OperationResult Post(ThingResource thingResource) 
    { 
     var thing = thingResource.ToThingEntity(); 
     thing = _thingService.Make(thing); 
     return new OperationResult.OK(thing.ToThingResource()); 
    } 

    [HttpOperation(HttpMethod.GET)] 
    public OperationResult Get(int id) 
    { 
     var thing = _thingService.Get(id); 
     return new OperationResult.OK(thing.ToThingResource()); 
    } 
} 

调试日志如下

 
13-[2011-03-01 10:38:59Z] Verbose(0) Incoming host request for http://api.local.site.com/Thing 
13-[2011-03-01 10:38:59Z] Verbose(0) Adding communication context data 
13-[2011-03-01 10:38:59Z] Warning(0) Contributor call for BootstrapperContributor had a null Action. 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor ExceptionHandlerContributor.LogException 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor HttpMethodOverriderContributor.OverrideHttpVerb 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor DigestAuthorizerContributor.ReadCredentials 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor UriDecoratorsContributor.ProcessDecorators 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor ResourceTypeResolverContributor.ResolveResource 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor HandlerResolverContributor.ResolveHandler 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor OperationCreatorContributor.CreateOperations 
    13-[2011-03-01 10:38:59Z] Verbose(0) Created operation named Post with signature ThingHandler::Post(ThingResource ThingResource) 
    13-[2011-03-01 10:38:59Z] Verbose(0) Created operation named Get with signature ThingHandler::Get(Int32 id) 
    13-[2011-03-01 10:38:59Z] Verbose(0) Created operation named Amend with signature ThingHandler::Amend(ThingResource ThingResource) 
    13-[2011-03-01 10:38:59Z] Verbose(0) Created operation named Cancel with signature ThingHandler::Cancel(Int32 id) 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor OperationFilterContributor.ProcessOperations 
    13-[2011-03-01 10:38:59Z] Verbose(0) Found 1 operation(s) with a matching name. 
    13-[2011-03-01 10:38:59Z] Verbose(0) Found 1 operation(s) with matching [HttpOperation] attribute. 
    13-[2011-03-01 10:38:59Z] Verbose(0) No resource or no uri name. Not filtering. 
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 
A first chance exception of type 'System.Exception' occurred in System.dll 
A first chance exception of type 'System.NotSupportedException' occurred in OpenRasta.DLL 
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 
A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 
A first chance exception of type 'System.Exception' occurred in System.dll 
A first chance exception of type 'System.NotSupportedException' occurred in OpenRasta.DLL 
    13-[2011-03-01 10:38:59Z] Error(0) None of the operations had members that could be matches against the uri parameters: 
id=Thing; 

13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Verbose(0) Pipeline is in RenderNow mode. 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor OperationResultInvokerContributor.RunOperationResult 
    13-[2011-03-01 10:38:59Z] Information(0) Executing OperationResult OperationResult: type=MethodNotAllowed, statusCode=405. 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor ResponseEntityCodecResolverContributor.FindResponseCodec 
    13-[2011-03-01 10:38:59Z] Information(0) No response codec was searched for. The response entity is null or a response codec is already set. 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor DigestAuthorizerContributor.WriteCredentialRequest 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Start(1) Entering PipelineRunner: Executing contributor ResponseEntityWriterContributor.WriteResponse 
    13-[2011-03-01 10:38:59Z] Verbose(0) There was no response entity, not rendering. 
    13-[2011-03-01 10:38:59Z] Verbose(0) Writing http headers. 
13-[2011-03-01 10:38:59Z] Stop(1) Exiting PipelineRunner 
13-[2011-03-01 10:38:59Z] Information(0) Pipeline finished. 

任何人在那里能够帮助我?

干杯

戴夫

+0

如果您可以添加一个调试日志,让我们知道POSTing时实际发生了什么。 – SerialSeb 2011-02-25 14:26:49

回答

0

没有记录,我只提供一个简单的潜在的答案。检查你在IIS中定义了哪些其他模块,并删除(或重新排序)那些需要POST到/(例如默认文档)的模块。很多这些模块都会贪婪地认为他们拥有这个请求,导致共谋。

+0

我对模块进行了重新排序,因此OpenRastaModule是第一个,但它仍然不起作用。你需要看什么日志? – DChater 2011-02-25 15:01:29

+0

将调试器(或DebugView)附加到iis工作进程,并在uri上执行您的请求,这会给您一个日志。我昨天在晚餐时听说过这个问题,所以真的有兴趣了解它。请注意,为服务器定义的模块(默认文档)默认在应用程序之前执行。 – SerialSeb 2011-02-25 17:04:59

+0

抱歉,延迟回复您。我用调试器的输出修改了原来的问题。我检查了服务器模块,但可能错过了一些东西,我现在会重新检查它们。 – DChater 2011-03-01 10:50:07

0

发布另一个答案,因为问题是不同的。

日志说你试图在/ Thing上做一些与模板/ {id}匹配的东西。然后,将该模板映射到您的方法中的一个int类型的id。事情不能转换为int,因此失败。

你是说你的应用程序在/ Thing中的虚拟目录?如果是这种情况,您需要将虚拟目录标记为应用程序,或者您需要将URI映射为/ Thing/{id}和/ Thing /。

+0

我已经修改了原始帖子,更详细地介绍了我的设置。这是否使它更清晰?再次感谢。 – DChater 2011-03-04 16:05:52

+0

呃,不是真的。日志说:没有任何操作的成员可以匹配的URI参数ID = THING;这意味着OpenRasta会看到您发布的URI(明显是某些东西/ Thing,它在您以前的调试日志中,并且不再存在,即使调试日志仍然可以看到它,所以我假设您只是手动编辑日志)针对uri模板查找资源(又名/ {id},因为您发布到/ Thing而不是/)。你有没有在IIS中检查过你的虚拟目录*是一个应用程序?看到我上面的评论为什么。 – SerialSeb 2011-03-09 02:10:45