C# 文本Uri请求
我看到过许多帖子询问如何使用不一致的URI,但没有一篇有好的答案。我正在编写一个Windows Phone控件,它需要使用HTTP GET请求ATOM数据。URL中需要包含字符%3d(等号)。这是不可协商的,因为这是我无法控制的第三方服务。设想一个如下所示的URL: 我将WebClient与DownloadStringAsync一起使用,但它只接受Uri对象,不接受字符串中的URL。Uri对象自动取消对这些字符的扫描并发送: 这是失败的。有一个不推荐使用的构造函数参数“UserExcaped”,这正是我需要的,但它不可用。我担心我唯一的选择是使用原始套接字和最小的HTTP支持实现我自己的字符串下载方法 还有其他想法吗?非常感谢您的帮助 更新C# 文本Uri请求,c#,windows-phone-7,uri,C#,Windows Phone 7,Uri,我看到过许多帖子询问如何使用不一致的URI,但没有一篇有好的答案。我正在编写一个Windows Phone控件,它需要使用HTTP GET请求ATOM数据。URL中需要包含字符%3d(等号)。这是不可协商的,因为这是我无法控制的第三方服务。设想一个如下所示的URL: 我将WebClient与DownloadStringAsync一起使用,但它只接受Uri对象,不接受字符串中的URL。Uri对象自动取消对这些字符的扫描并发送: 这是失败的。有一个不推荐使用的构造函数参数“UserExcaped
我还应该指出,如果我试图聪明地将百分比编码为%25(因此它是“prev=AAAAAA%253d&next=bbbbbbb”),那么我得到的确切文本字符串中的%25仍然完好无损!转换为等号非常有挑战性。尝试使用-您应该能够给它一个字符串而不是Uri。Uri类就是这样设计的: 作为某些方案构造函数中规范化的一部分, 转义表示被压缩。将为其创建URI的方案 紧凑转义序列包括以下内容:文件、http、https、, net.pipe和net.tcp。对于所有其他方案,转义序列是 没有压实 您是否尝试过改用HttpWebRequest?这比WebClient要复杂一点,但它允许您传递一个字符串作为目标 编辑-另一种方法是创建自己的
UriParser
,它允许编码版本。扩展UriParser
的示例如下
对于未运行Windows Phone的其他用户,您可以使用反射来修复此问题
MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
foreach (string scheme in new[] { "http", "https" })
{
UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
if (parser != null)
{
int flagsValue = (int)flagsField.GetValue(parser);
//0x20000 is the SimpleUserSyntax attribute
if ((flagsValue & 0x20000) != 0)
flagsField.SetValue(parser, flagsValue & ~0x20000);
}
}
}
Uri u = new Uri("http://host.com?arg1=val&arg=val2%3d");
//At this point, the %3d remains as expected.
是否有一种方法可以设置页面响应编码=“iso-8859-1”听起来像是编码问题您是否尝试过使用HttpUtility.UrlEncode或HttpUtility.UrlDecode等?我肯定用编码的参数访问服务器,但我使用的是HttpWebRequest。嗯。。。我在我的问题上加了一个例子。一旦你试图构建一个URI,它就会把它搞砸。这不是答案,但如果你找不到解决方案,它可能会有所帮助。我的建议是定义和托管您自己的web服务,并间接调用第三方的web服务。通过这种方式,您的应用程序不易受到Web服务定义更改的影响,您还可以跟踪应用程序的使用情况。。。HttpWebRequest(至少在Windows Phone上)使用RequestUri属性,该属性不是基于字符串的…@ArianKulp-启动WebRequest:所以我只是尝试了一下。它确实接受字符串,但显然它只是在内部构造一个Uri对象,因为它执行相同的转义。啊!我只是试着修复它,我通过反射在控制台应用程序中成功地使它工作。我可以清除SimpleUserSyntax
属性,但问题是,当我尝试通过反射调用方法时,Windows Phone会引发异常。SimpleUserSyntax
属性似乎是问题所在。@ArianKulp-您可以创建自己的UriParser并允许使用编码版本:好看的框架。我从来没有听说过。同样的问题。
MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
foreach (string scheme in new[] { "http", "https" })
{
UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
if (parser != null)
{
int flagsValue = (int)flagsField.GetValue(parser);
//0x20000 is the SimpleUserSyntax attribute
if ((flagsValue & 0x20000) != 0)
flagsField.SetValue(parser, flagsValue & ~0x20000);
}
}
}
Uri u = new Uri("http://host.com?arg1=val&arg=val2%3d");
//At this point, the %3d remains as expected.