当前位置:  开发笔记 > 编程语言 > 正文

HttpWebRequest长URI解决方法?

如何解决《HttpWebRequest长URI解决方法?》经验,为你挑选了1个好方法。

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

我目前的解决方法是允许用户设置一个兼容性标志,以便将参数作为POST请求发送是安全的,而不是在URI太长的情况下,但这并不理想,因为我使用的协议是RESTful和GET应该用于查询.此外,没有任何保证协议的其他实现者将接受POSTed查询

在.Net中是否有另一个类具有与HttpWebRequest相同的功能,而不受我可以使用的URI长度限制的影响?
我知道WebClient,但我真的不想使用它,因为我需要能够完全控制WebClient限制其能力的HTTP标头.

编辑

因为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: 
PREFIX rdfs: 
PREFIX xsd: 
PREFIX skos: 
PREFIX dc: 
PREFIX po: 
PREFIX timeline: 
SELECT * WHERE {
   dc:title ?title .
   po:short_synopsis ?synopsis-short .
   po:medium_synopsis ?synopsis-med .
   po:long_synopsis ?synopsis-long .
   po:masterbrand ?channel .
   po:genre ?genre .
  ?channel dc:title ?channeltitle .
  OPTIONAL {
     po:brand ?brand .
    ?brand dc:title ?brandtitle .
  }
  OPTIONAL {
     po:version ?ver .
    ?ver po:time ?interval .
    ?interval timeline:start ?start .
    ?interval timeline:end ?end .
  }

}



1> bobince..:

我正在使用的协议是RESTful,GET应该用于查询.

没有理由POST也不能用于查询; 对于非常长的请求数据,因为非常长的URI不是全局支持的,而且从来没有.这是HTTP不符合REST理想的一个领域.

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

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有