Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本Uri请求_C#_Windows Phone 7_Uri - Fatal编程技术网

C# 文本Uri请求

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

我看到过许多帖子询问如何使用不一致的URI,但没有一篇有好的答案。我正在编写一个Windows Phone控件,它需要使用HTTP GET请求ATOM数据。URL中需要包含字符%3d(等号)。这是不可协商的,因为这是我无法控制的第三方服务。设想一个如下所示的URL:

我将WebClient与DownloadStringAsync一起使用,但它只接受Uri对象,不接受字符串中的URL。Uri对象自动取消对这些字符的扫描并发送:

这是失败的。有一个不推荐使用的构造函数参数“UserExcaped”,这正是我需要的,但它不可用。我担心我唯一的选择是使用原始套接字和最小的HTTP支持实现我自己的字符串下载方法

还有其他想法吗?非常感谢您的帮助

更新


我还应该指出,如果我试图聪明地将百分比编码为%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.