1

仮想ディレクトリとしていくつかのopenrastaアプリケーションをホストするiis7のサイトがあります。これらの openrasta アプリケーションの 1 つは単一のリソースをホストするため、その仮想ディレクトリのルートで実行する必要があります。リソースを正常に取得できますが、リソースを POST できません。POST すると 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

resource5 を取得できますが、以下の構成を使用して POST できません。

投稿時に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) http://api.local.site.com/Thing の着信ホスト要求
13-[2011-03-01 10:38:59Z] Verbose(0) 通信コンテキスト データの追加
13-[2011-03-01 10:38:59Z] 警告 (0) BootstrapperContributor の Contributor 呼び出しに null アクションがありました。
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor ExceptionHandlerContributor.LogException を実行中
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor HttpMethodOverriderContributor.OverrideHttpVerb を実行する
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor を実行中 DigestAuthorizerContributor.ReadCredentials
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor UriDecoratorsContributor.ProcessDecorators を実行中
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor ResourceTypeResolverContributor.ResolveResource を実行中
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor HandlerResolverContributor.ResolveHandler を実行する
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor OperationCreatorContributor.CreateOperations を実行する
    13-[2011-03-01 10:38:59Z] Verbose(0) 署名 ThingHandler::Post(ThingResource ThingResource) を持つ Post という名前の操作を作成しました
    13-[2011-03-01 10:38:59Z] Verbose(0) 署名 ThingHandler::Get(Int32 id) を持つ Get という名前の操作を作成しました
    13-[2011-03-01 10:38:59Z] Verbose(0) 署名 ThingHandler::Amend(ThingResource ThingResource) を持つ Amend という名前の操作を作成しました
    13-[2011-03-01 10:38:59Z] Verbose(0) 署名 ThingHandler::Cancel(Int32 id) を持つ Cancel という名前の操作を作成しました
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor OperationFilterContributor.ProcessOperations を実行する
    13-[2011-03-01 10:38:59Z] Verbose(0) 名前が一致する操作が 1 つ見つかりました。
    13-[2011-03-01 10:38:59Z] Verbose(0) [HttpOperation] 属性に一致する 1 つの操作が見つかりました。
    13-[2011-03-01 10:38:59Z] 詳細 (0) リソースまたは URI 名がありません。フィルタリングしていません。
タイプ 'System.FormatException' の初回例外が mscorlib.dll で発生しました
タイプ 'System.FormatException' の初回例外が mscorlib.dll で発生しました
System.dll で、タイプ 'System.Exception' の初回例外が発生しました
タイプ 'System.NotSupportedException' の初回例外が OpenRasta.DLL で発生しました
タイプ 'System.FormatException' の初回例外が mscorlib.dll で発生しました
タイプ 'System.FormatException' の初回例外が mscorlib.dll で発生しました
System.dll で、タイプ 'System.Exception' の初回例外が発生しました
タイプ 'System.NotSupportedException' の初回例外が OpenRasta.DLL で発生しました
    13-[2011-03-01 10:38:59Z] エラー (0) いずれの操作にも、URI パラメーターと一致するメンバーがありませんでした:
id=モノ;

13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Verbose(0) パイプラインは RenderNow モードです。
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor を実行する OperationResultInvokerContributor.RunOperationResult
    13-[2011-03-01 10:38:59Z] 情報(0) 実行中 OperationResult OperationResult: type=MethodNotAllowed, statusCode=405.
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor ResponseEntityCodecResolverContributor.FindResponseCodec を実行中
    13-[2011-03-01 10:38:59Z] 情報(0) 応答コーデックが検索されませんでした。応答エンティティが null であるか、応答コーデックが既に設定されています。
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor を実行します DigestAuthorizerContributor.WriteCredentialRequest
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] Start(1) PipelineRunner に入る: contributor ResponseEntityWriterContributor.WriteResponse を実行中
    13-[2011-03-01 10:38:59Z] Verbose(0) レンダリングではなく、応答エンティティがありませんでした。
    13-[2011-03-01 10:38:59Z] Verbose(0) http ヘッダーの書き込み。
13-[2011-03-01 10:38:59Z] Stop(1) PipelineRunner の終了
13-[2011-03-01 10:38:59Z] 情報(0) パイプラインが終了しました。

これで私を助けることができる人はいますか?

乾杯

デイブ

4

2 に答える 2

0

問題が異なるため、別の回答を投稿します。

ログには、テンプレート/{id}と一致する/Thingで何かを行おうとしていることが示されています。次に、そのテンプレートがメソッド内でint型のIDにマップされます。Thingをintに変換できないため、失敗します。

アプリケーションが/Thingの仮想ディレクトリにあると言っていますか?その場合は、仮想ディレクトリをアプリケーションとしてマークするか、URIを/ Thing/{id}および/Thing/としてマップする必要があります。

于 2011-03-02T10:58:36.137 に答える
0

ログがなければ、単純な潜在的な答えを 1 つだけ提供します。IIS で定義した他のモジュールを確認し、/ への POST を実行するモジュール (既定のドキュメントなど) を削除 (または並べ替え) します。それらのモジュールの多くは貪欲に要求を所有していると想定し、互換性地獄を引き起こします。

于 2011-02-25T14:28:48.457 に答える