1

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

在本地它看起来像:

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

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

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

我能够获取 resource5,但无法使用以下配置发布到它。

它不应该与模板“/{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)管道完成。

有没有人能帮我解决这个问题?

干杯

戴夫

4

2 回答 2

0

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

于 2011-02-25T14:28:48.457 回答
0

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

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

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

于 2011-03-02T10:58:36.137 回答