首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceStack catch-all路由未收到某些请求

ServiceStack catch-all路由未收到某些请求
EN

Stack Overflow用户
提问于 2015-03-19 07:22:17
回答 1查看 176关注 0票数 0

我有一个专门的应用程序,它希望访问请求流并进行自己的处理。这适用于所有类型的请求(Get、Post、Put、Delete、Head),但是有一个客户端PUT找不到路由。我在单声道/Centos上运行的ServiceStack有以下DTO定义:

代码语言:javascript
复制
[Route("/*", "GET POST PUT DELETE HEAD")]
[FallbackRoute("/{Path*}")]
public class S3Request  : IRequiresRequestStream{ 
    public string Path{ get; set; }
    public Stream RequestStream { get; set; }
}

我使用tcpflow捕获centos机器上的http流量。tcpflow的第一个输出是针对客户端的,其中捕获了PUT,并且我的代码调用:

代码语言:javascript
复制
192.168.079.001.61255-192.168.079.129.01301: PUT / HTTP/1.1
Host: rack.s3devel.domain.com
Date: Wed, 18 Mar 2015 21:26:57 GMT
Authorization: AWS Y29tZXQ=:4ddNcEF11uXZYy2IlL4YUNiMn54=
Connection: Keep-Alive
User-Agent: DragonDisk 1.05 ( http://www.dragondisk.com )
Content-Length: 0

非工作客户端tcpflow输出:

代码语言:javascript
复制
192.168.079.070.58556-192.168.079.129.00080: PUT / HTTP/1.1
Host: rack.s3devel.domain.com
Authorization: AWS Y29tZXQ=:Um+1V6iWvkMVbh12lyDAXGUQCo4=
Date: Wed, 18 Mar 2015 21:25:18 GMT
User-Agent: aws-sdk-java/1.6.12 Linux/3.10.13-101.fc18.x86_64 OpenJDK_64-Bit_Server_VM/24.45-b08/1.7.0_45
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 0
Connection: Keep-Alive

我在考虑买一台RawHttpHandler,但我不明白为什么我需要一台?这个头文件中有没有什么东西让ServiceStack找不到Put回调?

EN

回答 1

Stack Overflow用户

发布于 2015-03-19 08:06:39

[Route("/*")]属性可能并不表示您所认为的含义,{Var*}之外的*只是表示文字形式的*,而不是您假设的任何通配符模式。

此外,您不应该在请求DTO上有任何其他具有[FallbackRoute][Route]属性(这是不必要的/令人困惑的),并且当您没有提供任何HTTP方法时,它假定它允许所有这些方法,所以我将您的请求更改为:

代码语言:javascript
复制
[FallbackRoute("/{Path*}")]
public class S3Request  : IRequiresRequestStream
{ 
    public string Path{ get; set; }
    public Stream RequestStream { get; set; }
}

使用FormData强制预加载请求InputStream

但是看起来你的问题是由于application/x-www-form-urlencoded,它填充了Request.FormData字典,ServiceStack会检查它是否包含任何POST数据请求覆盖。查看Request.FormData会强制加载请求流,这会阻止处理程序中后续的InputStream访问。

创建请求时跳过读取FormData

您可以使用以下命令告诉ServiceStack在创建请求时跳过查看FormData:

代码语言:javascript
复制
SetConfig(new HostConfig {
    SkipFormDataInCreatingRequest = true
}); 

使用自定义处理程序的替代代理实现

latest v4.0.38 Release Notes中解释了SkipFormDataInCreatingRequest配置选项,它还提供了一种简单的替代方法,可以使用以下命令代理请求:

代码语言:javascript
复制
RawHttpHandlers.Add(_ => new CustomActionHandler((req, res) => {
    var bytes = req.InputStream.ReadFully();
    res.OutputStream.Write(bytes, 0, bytes.Length);
}));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29134522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档