c# - HttpWebRequest 长 URI 解决方法?

标签 c# .net httpwebrequest uri

我在使用 HttpWebRequest 时遇到了一个问题,如果 URI 超过 2048 个字符,请求就会失败并返回 404 错误,即使服务器完全能够为 URI 这么长的请求提供服务。我知道这一点,因为如果通过 HttpWebRequest 提交会导致错误的相同 URI 在直接粘贴到浏览器地址栏时工作正常。

我目前的解决方法是允许用户设置一个兼容性标志,以表明在 URI 太长的情况下将参数作为 POST 请求发送是安全的,但这并不理想,因为我使用的协议(protocol)using 是 RESTful 的,应该使用 GET 进行查询。此外,不保证该协议(protocol)的其他实现者将接受 POSTed 查询

.Net 中是否有另一个类具有与 HttpWebRequest 等效的功能,并且不受我可以使用的 URI 长度限制的影响?
我知道 WebClient,但我真的不想使用它,因为我需要能够完全控制 WebClient 限制的 HTTP header 。

编辑

因为 Shoban 要求:

http://localhost/BBCDemo/sparql/?query=PREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0D%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0D%0APREFIX+skos%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2004%2F02%2Fskos%2Fcore%23%3E%0D%0APREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%0D%0APREFIX+po%3A+%3Chttp%3A%2F%2Fpurl.org%2Fontology%2Fpo%2F%3E%0D%0APREFIX+timeline%3A+%3Chttp%3A%2F%2Fpurl.org%2FNET%2Fc4dm%2Ftimeline.owl%23%3E%0D%0ASELECT+*+WHERE+{%0D%0A++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+dc%3Atitle+%3Ftitle+.%0D%0A++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Ashort_synopsis+%3Fsynopsis-short+.%0D%0A++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Amedium_synopsis+%3Fsynopsis-med+.%0D%0A++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Along_synopsis+%3Fsynopsis-long+.%0D%0A++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Amasterbrand+%3Fchannel+.%0D%0A++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Agenre+%3Fgenre+.%0D%0A++++%3Fchannel+dc%3Atitle+%3Fchanneltitle+.%0D%0A++++OPTIONAL+{%0D%0A++++++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Abrand+%3Fbrand+.%0D%0A++++++++%3Fbrand+dc%3Atitle+%3Fbrandtitle+.%0D%0A++++}%0D%0A++++OPTIONAL+{%0D%0A++++++++%3Chttp%3A%2F%2Fwww.bbc.co.uk%2Fprogrammes%2Fb00n4d6y%23programme%3E+po%3Aversion+%3Fver+.%0D%0A++++++++%3Fver+po%3Atime+%3Finterval+.%0D%0A++++++++%3Finterval+timeline%3Astart+%3Fstart+.%0D%0A++++++++%3Finterval+timeline%3Aend+%3Fend+.%0D%0A++++}%0D%0A}&default-graph-uri=&timeout=30000

以下是编码到查询字符串中的内容:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX po: <http://purl.org/ontology/po/>
PREFIX timeline: <http://purl.org/NET/c4dm/timeline.owl#>
SELECT * WHERE {
  <http://www.bbc.co.uk/programmes/b00n4d6y#programme> dc:title ?title .
  <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:short_synopsis ?synopsis-short .
  <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:medium_synopsis ?synopsis-med .
  <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:long_synopsis ?synopsis-long .
  <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:masterbrand ?channel .
  <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:genre ?genre .
  ?channel dc:title ?channeltitle .
  OPTIONAL {
    <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:brand ?brand .
    ?brand dc:title ?brandtitle .
  }
  OPTIONAL {
    <http://www.bbc.co.uk/programmes/b00n4d6y#programme> po:version ?ver .
    ?ver po:time ?interval .
    ?interval timeline:start ?start .
    ?interval timeline:end ?end .
  }

最佳答案

the protocol I'm using is RESTful and GET should be used for queries.

没有理由不能将 POST 用于查询;对于非常长的请求数据,您必须这样做,因为非常长的 URI 不受全局支持,而且从未受过支持。这是 HTTP 不符合 REST 理想的领域之一。

POST 通常不用于纯 HTML 级别的原因是停止浏览器提示重新加载,并促进例如。书签。但是对于 HttpWebRequest,您没有任何这些顾虑,所以请继续发布它。 Web 应用程序应该使用参数或 URI 路径部分来区分写入请求和查询,而不仅仅是请求方法。 (当然,来自 GET 方法的写请求仍然应该被拒绝。)

关于c# - HttpWebRequest 长 URI 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587857/

相关文章:

.net - 如何在不安装的情况下运行scriptcs?制作可移植/独立脚本 (csx)

c# - 不可修改的变量

带有 post 的 C# HTTPS 请求

c# - 在 Entity Framework 中填充导航属性?

c# - 复合 linq 查询

c# - 字符串末尾数字的正则表达式?

c# - 在 EntityDataSource 中使用参数化的 LIKE 子句

c# - 如何在 Visual Studio 控制台应用程序中禁用控制台窗口的关闭按钮?

javascript - 如何使用javascript检查网站的响应时间?

c# - 使用相同的 HttpWebRequest obj 请求第二个 url