【问题标题】:Openrasta posting to resource at the base uriOpenrasta 发布到基础 uri 的资源
【发布时间】:2011-02-25 10:40:59
【问题描述】:

我在 iis7 中有一个站点,将几个 openrasta 应用程序作为虚拟目录托管。其中一个 openrasta 应用程序托管单个资源,因此我希望它在该虚拟目录的根目录中运行。我能够成功获取资源,但无法发布资源。发布时出现 405 错误。

在本地看起来像:

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

我想添加另一个应用程序,但由于此应用程序仅包含 1 个资源,我想通过应用程序的基本 uri 访问它。即

http://localhost/OpenRastaApp3 不是 http://localhost/OpenRastaApp3/Resource5

我能够获取资源 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] 详细 (0) http://api.local.site.com/Thing 的传入主机请求 13-[2011-03-01 10:38:59Z] 详细(0)添加通信上下文数据 13-[2011-03-01 10:38:59Z] 警告(0)对 BootstrapperContributor 的贡献者调用有一个空操作。 13-[2011-03-01 10:38:59Z] Start(1)进入PipelineRunner:执行贡献者ExceptionHandlerContributor.LogException 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] Start(1) 进入 PipelineRunner: 执行贡献者 HttpMethodOverriderContributor.OverrideHttpVerb 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 开始(1)进入 PipelineRunner:执行贡献者 DigestAuthorizerContributor.ReadCredentials 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 开始(1)进入 PipelineRunner:执行贡献者 UriDecoratorsContributor.ProcessDecorators 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] Start(1) 进入 PipelineRunner: 执行贡献者 ResourceTypeResolverContributor.ResolveResource 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] Start(1)进入PipelineRunner:执行贡献者HandlerResolverContributor.ResolveHandler 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] Start(1) 进入 PipelineRunner: 执行贡献者 OperationCreatorContributor.CreateOperations 13-[2011-03-01 10:38:59Z] Verbose(0) 创建了名为 Post 的操作,签名为 ThingHandler::Post(ThingResource ThingResource) 13-[2011-03-01 10:38:59Z] Verbose(0) 创建了名为 Get 的操作,带有签名 ThingHandler::Get(Int32 id) 13-[2011-03-01 10:38:59Z] Verbose(0) 创建了名为 Amend 的操作,带有签名 ThingHandler::Amend(ThingResource ThingResource) 13-[2011-03-01 10:38:59Z] Verbose(0) 创建了名为 Cancel 的操作,带有签名 ThingHandler::Cancel(Int32 id) 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] Start(1) 进入 PipelineRunner: 执行贡献者 OperationFilterContributor.ProcessOperations 13-[2011-03-01 10:38:59Z] 详细(0)找到 1 个具有匹配名称的操作。 13-[2011-03-01 10:38:59Z] 详细 (0) 找到 1 个具有匹配 [HttpOperation] 属性的操作。 13-[2011-03-01 10:38:59Z] 详细(0)没有资源或没有 uri 名称。不过滤。 mscorlib.dll 中出现了“System.FormatException”类型的第一次机会异常 mscorlib.dll 中出现了“System.FormatException”类型的第一次机会异常 System.dll 中出现“System.Exception”类型的第一次机会异常 OpenRasta.DLL 中出现了“System.NotSupportedException”类型的第一次机会异常 mscorlib.dll 中出现了“System.FormatException”类型的第一次机会异常 mscorlib.dll 中出现了“System.FormatException”类型的第一次机会异常 System.dll 中出现“System.Exception”类型的第一次机会异常 OpenRasta.DLL 中出现了“System.NotSupportedException”类型的第一次机会异常 13-[2011-03-01 10:38:59Z] 错误(0)没有任何操作具有可以与 uri 参数匹配的成员: id=东西; 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 详细(0)管道处于 RenderNow 模式。 13-[2011-03-01 10:38:59Z] Start(1) 进入 PipelineRunner: 执行贡献者 OperationResultInvokerContributor.RunOperationResult 13-[2011-03-01 10:38:59Z] 信息(0)执行 OperationResult OperationResult:type=MethodNotAllowed,statusCode=405。 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 开始(1)进入 PipelineRunner:执行贡献者 ResponseEntityCodecResolverContributor.FindResponseCodec 13-[2011-03-01 10:38:59Z] 信息(0)未搜索响应编解码器。响应实体为空或已设置响应编解码器。 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 开始(1)进入 PipelineRunner:执行贡献者 DigestAuthorizerContributor.WriteCredentialRequest 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 开始(1)进入 PipelineRunner:执行贡献者 ResponseEntityWriterContributor.WriteResponse 13-[2011-03-01 10:38:59Z] 详细(0)没有响应实体,没有呈现。 13-[2011-03-01 10:38:59Z] 详细(0)编写 http 标头。 13-[2011-03-01 10:38:59Z] 停止(1)退出 PipelineRunner 13-[2011-03-01 10:38:59Z] 信息(0)管道完成。

有谁可以帮我解决这个问题?

干杯

戴夫

【问题讨论】:

  • 如果您可以添加一个调试日志,让我们知道 POST 时实际发生的情况。

标签: openrasta


【解决方案1】:

如果没有日志,我只会提供一个简单的潜在答案。检查您在 IIS 中定义的其他模块并删除(或重新排序)需要 POST 到 / 的模块(例如默认文档)。很多这些模块会贪婪地假设它们拥有请求,从而导致兼容性地狱。

【讨论】:

  • 我对模块进行了重新排序,以便 OpenRastaModule 排在第一位,但它仍然无法正常工作。您需要查看什么日志?
  • 将调试器(或 DebugView)附加到 iis 工作进程并在 uri 上执行您的请求,这将为您提供日志。实际上,我昨天在晚餐时听说过这个问题,所以真的很感兴趣。请注意,默认情况下,为服务器定义的模块(默认文档)在应用程序中的模块之前执行。
  • 很抱歉延迟回复您。我已经用调试器的输出修改了原始问题。我检查了服务器模块,但可能遗漏了一些东西,我现在会重新检查它们。
【解决方案2】:

由于问题不同,请发布另一个答案。

日志显示您尝试在 /Thing 上执行某些操作,它与模板 /{id} 匹配。然后,该模板在您的方法中映射到 int 类型的 id。 Thing 无法转换为 int,因此失败。

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

【讨论】:

  • 我已经修改了原始帖子,并提供了更多关于我的设置的详细信息。这是否使它更清楚?再次感谢。
  • 嗯,不是真的。日志说:没有一个操作有可能与 uri 参数 id=Thing 匹配的成员;这意味着 OpenRasta 会看到您发布到的 URI(显然是某事/事物,它在您以前的调试日志中并且不再存在,即使调试日志仍然可以看到它,所以我假设您只是手动编辑了日志),匹配它针对 uri 模板查找资源(又名 /{id},因为您发布到 /Thing 而不是 /)。您是否在 IIS 中检查了您的虚拟目录 一个应用程序?请参阅我上面的评论,了解原因。
猜你喜欢
  • 2020-12-11
  • 2011-08-17
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多