如何在OpenRasta中使用form / prefix / {suffix}的URI模板处理多部分POST?

时间:2011-10-08 04:32:20

标签: openrasta

我正在尝试使用/ template / {contentId}的URI模板声明处理OpenRasta中的多部分文档的POST,但它失败了。配置是

ResourceSpace.Has.ResourcesOfType<Content>().AtUri("/content/{contentId}").HandledBy<ContentHandler>().RenderedByAspx("~/Views/ContentView.aspx").And.AsJsonDataContract();

处理程序方法如下:

public OperationResult Post(string contentId, IEnumerable<IMultipartHttpEntity> entities) {...}

我正在使用以下curl命令来测试

./curl -v -F myPartName=@./hello.txt http://localhost:10247/content/id-1

如果我从URI模板中删除“{contentId}”并相应地修改处理程序,POST工作正常。

有关如何解决的任何想法?日志文件如下。谢谢 - 罗兰岛

4-[2011-10-10 02:27:47Z] Verbose(0) Starts pre-executing the request.
4-[2011-10-10 02:27:47Z] Verbose(0) Incoming host request for http://localhost:10247/content/id-1
4-[2011-10-10 02:27:47Z] Verbose(0) Adding communication context data
4-[2011-10-10 02:27:47Z] Warning(0) Contributor call for BootstrapperContributor had a null Action.
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor HttpMethodOverriderContributor.OverrideHttpVerb
4-[2011-10-10 02:27:47Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor AuthenticationContributor.AuthoriseRequest
4-[2011-10-10 02:27:47Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor UriDecoratorsContributor.ProcessDecorators
4-[2011-10-10 02:27:47Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor ResourceTypeResolverContributor.ResolveResource
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Verbose(0) Rewrote path.
4-[2011-10-10 02:27:51Z] Start(1) Entering OpenRastaRewriterHandler: Rewriting to original path
    4-[2011-10-10 02:27:51Z] Start(1) Entering OpenRastaIntegratedHandler: Request for http://localhost:10247/content/id-1
        4-[2011-10-10 02:27:51Z] Verbose(0) Incoming host request for http://localhost:10247/content/id-1
        4-[2011-10-10 02:27:51Z] Verbose(0) Adding communication context data
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor HandlerResolverContributor.ResolveHandler
        4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationCreatorContributor.CreateOperations
            4-[2011-10-10 02:27:51Z] Verbose(0) Created operation named Get with signature ContentHandler::Get(String contentId)
            4-[2011-10-10 02:27:51Z] Verbose(0) Created operation named Post with signature ContentHandler::Post(String contentId, IEnumerable`1 entities)
        4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationFilterContributor.ProcessOperations
            4-[2011-10-10 02:27:51Z] Verbose(0) Found 1 operation(s) with a matching name.
            4-[2011-10-10 02:27:51Z] Verbose(0) Found 0 operation(s) with matching [HttpOperation] attribute.
            4-[2011-10-10 02:27:51Z] Verbose(0) No resource or no uri name. Not filtering.
        4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationCodecSelectorContributor.ProcessOperations
            4-[2011-10-10 02:27:51Z] Information(0) Operation ContentHandler::Post(String contentId, IEnumerable`1 entities) selected with 2 required members and 0 optional members, with codec MultipartFormDataKeyedValuesCodec with score 1.5.
        4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationHydratorContributor.ProcessOperations
            4-[2011-10-10 02:27:51Z] Information(0) Operation ContentHandler::Post(String contentId, IEnumerable`1 entities) was selected with a codec score of 1.5
            4-[2011-10-10 02:27:51Z] Information(0) Loaded codec OpenRasta.Codecs.MultipartFormDataKeyedValuesCodec
            4-[2011-10-10 02:27:51Z] Information(0) Codec supports IKeyedValuesMediaTypeReader. Processing parameters.
            4-[2011-10-10 02:27:51Z] Verbose(0) Seeking to next available part
            4-[2011-10-10 02:27:51Z] Verbose(0) Skip the preamble. AtPreamble was True.
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) Preamble found: True of size 0
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) Skip the preamble. AtPreamble was False.
            4-[2011-10-10 02:27:51Z] Verbose(0) Preamble found: False of size 0
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) Seeking to next available part
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) not null
            4-[2011-10-10 02:27:51Z] Verbose(0) Key myPartName was not successfully assigned.
            4-[2011-10-10 02:27:51Z] Verbose(0) Key myPartName was not successfully assigned.
        4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationInterceptorContributor.WrapOperations
        4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationInvokerContributor.ExecuteOperations
            4-[2011-10-10 02:27:51Z] Verbose(0) Ignoring constructor, following dependencies didn't have a registration:OpenRasta.OperationModel.Interceptors.IOperationInterceptor[]
A first chance exception of type 'System.InvalidOperationException' occurred in OpenRasta.DLL
            4-[2011-10-10 02:27:52Z] Error(0) An error of type System.InvalidOperationException has been thrown
            4-[2011-10-10 02:27:52Z] Error(0) System.InvalidOperationException: The operation is not ready for invocation.
            4-[2011-10-10 02:27:52Z] Error(0)    at OpenRasta.OperationModel.MethodBased.MethodBasedOperation.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\MethodBased\MethodBasedOperation.cs:line 56
            4-[2011-10-10 02:27:52Z] Error(0)    at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.<Invoke>b__0() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 47
            4-[2011-10-10 02:27:52Z] Error(0)    at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 52
            4-[2011-10-10 02:27:52Z] Error(0)    at OpenRasta.OperationModel.OperationExecutor.Execute(IEnumerable`1 operations) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\OperationExecutor.cs:line 14
            4-[2011-10-10 02:27:52Z] Error(0)    at OpenRasta.Pipeline.Contributors.OperationInvokerContributor.ExecuteOperations(ICommunicationContext context) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\Contributors\OperationInvokerContributor.cs:line 29
            4-[2011-10-10 02:27:52Z] Error(0)    at OpenRasta.Pipeline.PipelineRunner.ExecuteContributor(ICommunicationContext context, ContributorCall call) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\PipelineRunner.cs:line 192
        4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:52Z] Error(0) Aborting the pipeline and rendering the errors.
        4-[2011-10-10 02:27:52Z] Error(0) An error has occurred and the processing of the request has stopped.

Exception:
System.InvalidOperationException: The operation is not ready for invocation.
   at OpenRasta.OperationModel.MethodBased.MethodBasedOperation.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\MethodBased\MethodBasedOperation.cs:line 56
   at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.<Invoke>b__0() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 47
   at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 52
   at OpenRasta.OperationModel.OperationExecutor.Execute(IEnumerable`1 operations) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\OperationExecutor.cs:line 14
   at OpenRasta.Pipeline.Contributors.OperationInvokerContributor.ExecuteOperations(ICommunicationContext context) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\Contributors\OperationInvokerContributor.cs:line 29
   at OpenRasta.Pipeline.PipelineRunner.ExecuteContributor(ICommunicationContext context, ContributorCall call) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\PipelineRunner.cs:line 192
        4-[2011-10-10 02:27:52Z] Verbose(0) Pipeline is in RenderNow mode.
        4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor OperationResultInvokerContributor.RunOperationResult
            4-[2011-10-10 02:27:52Z] Information(0) Executing OperationResult OperationResult: type=InternalServerError, statusCode=500.
        4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor ResponseEntityCodecResolverContributor.FindResponseCodec
            4-[2011-10-10 02:27:52Z] Information(0) Selected codec HtmlErrorCodec out of 2 codecs for entity of type ServerErrorList and negotiated media type text/html; q=0.5.
        4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor AuthenticationChallengerContributor.ChallengeIfUnauthorized
        4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor ResponseEntityWriterContributor.WriteResponse
            4-[2011-10-10 02:27:52Z] Verbose(0) Codec HtmlErrorCodec selected.
            4-[2011-10-10 02:27:52Z] Start(1) Entering ResponseEntityWriterContributor: Generating response entity.
                4-[2011-10-10 02:27:52Z] Verbose(0) Setting Content-Length to 2159
            4-[2011-10-10 02:27:52Z] Stop(1) Exiting ResponseEntityWriterContributor
            4-[2011-10-10 02:27:52Z] Verbose(0) Writing http headers.
            4-[2011-10-10 02:27:52Z] Verbose(0) Writing http header Content-Length:2159
            4-[2011-10-10 02:27:52Z] Verbose(0) Writing http header Content-Type:text/html
        4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
        4-[2011-10-10 02:27:52Z] Information(0) Pipeline finished.
    4-[2011-10-10 02:27:52Z] Stop(1) Exiting OpenRastaIntegratedHandler
4-[2011-10-10 02:27:52Z] Stop(1) Exiting OpenRastaRewriterHandler
4-[2011-10-10 02:27:52Z] Verbose(0) Request finished.
The thread '<No Name>' (0x1f68) has exited with code 0 (0x0).

1 个答案:

答案 0 :(得分:1)

从日志中,您可以看到多部分编解码器正在键/值处理模式中使用。在该模式下,正在解析multipart的内容而不是分配IEnumerable,这肯定是该编解码器的问题。

我在https://github.com/openrasta/openrasta-core/issues/32

添加了修复此问题的错误

与此同时,您可以让多部分编解码器根据需要反序列化内容(您可以通过简单地将DTO或输入参数映射到表单实体的名称来使用,OpenWrap将允许您将表单数据分配到标准属性和IFile或Stream for files)。

或者,根据您的需要,您可以通过覆盖依赖注册器来取消注册密钥/值mutlipart编解码器,并让对象注册正常工作。