【问题标题】:(partial) HTTP Request isn't recognized by C# HTTP Server(部分)C# HTTP 服务器无法识别 HTTP 请求
【发布时间】:2014-12-28 01:31:11
【问题描述】:

在我的 Visual Studio 13 控制台应用程序中,我在 TCP-Socket 上接收到以下字节流(从嵌入式设备接收):

POST /setup HTTP/1.1
Content-Length: 6
Content-Type: application/setup+tlv8

TLV8-data

虽然它似乎是一个有效的 http 请求,但我的以下尝试都没有成功将其识别为 http 请求:(在常规 HTTP 请求上它们可以正常工作)

到目前为止,我实际上只对 POST 或 GET 请求的 path 以及正文中附加的 content(tlv 格式)感兴趣。

我配置错了吗?例如:我需要告诉正确的内容类型? 有什么办法可以摆脱编写自己的简单文本解析器?

grapevine的代码示例:

private void init()
    {
        s = new PairServer();
        s.Host = "172.28.22.78"; 
        s.Port = "52025"; 
        s.Start();
   }

提供以下服务器类:

public class PairServer : RestServer
    {
        [RestRoute(Method = HttpMethod.POST, PathInfo = @"^/setup")]
        [RestRoute(Method = HttpMethod.GET, PathInfo = @"^/setup")]
        public void PairSetup(HttpListenerContext context)
        {
            // will not reach here
        }

        [RestRoute(Method = HttpMethod.POST)]
        public void AnyRoute(HttpListenerContext context)
        {
           // Not even here
        }

【问题讨论】:

标签: c# http-post httprequest httplistener grapevine


【解决方案1】:

虽然它看起来是一个有效的http请求

不,这不是一个有效的 HTTP 请求。正如specification 所述,有效的HTTP 请求必须包含Host 请求标头:

客户端必须在所有 HTTP/1.1 请求中包含 Host 标头字段 消息。如果请求的 URI 不包含 Internet 主机名 对于被请求的服务,主机头字段必须是 给出一个空值。 HTTP/1.1 代理必须确保任何 它转发的请求消息确实包含适当的 Host 标头 标识代理请求的服务的字段。全部 基于 Internet 的 HTTP/1.1 服务器必须以 400(错误请求)响应 任何缺少 Host 标头的 HTTP/1.1 请求消息的状态码 字段。

因此,请确保您的客户遵循规范:

POST /setup HTTP/1.1
Host: example.com
Content-Length: 6
Content-Type: application/setup+tlv8

TLV8-data

【讨论】:

  • 无法更改http请求怎么办?所以请求总是缺少主机头?没关系,您的回答解释了为什么常规方法不起作用。
  • @Darin-Dimitrov 是正确的。 Grapevine 使用 HttpListener 侦听协议/主机/端口组合,如果您的请求不是针对特定主机(即使是 IP 地址就足够了),那么它永远不会接收请求。
猜你喜欢
  • 2015-04-01
  • 2014-12-02
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多