【问题标题】:WebRequest results with "URI prefix is not recognized."带有“URI 前缀无法识别”的 WebRequest 结果。
【发布时间】:2013-02-14 23:05:14
【问题描述】:

我正在尝试为“mms://wms.iskon.hr/Novi20%25radio20%25Djakovo”获取 WebReguest,但我得到 NotSupportedException 说:“URI 前缀无法识别”。 我使用的代码很简单:

Uri uri = new Uri(watchedStream.URL.Trim());
WebRequest wr = WebRequest.Create(uri);

Mms 方案是这个问题的根源,但我就是想不出可行的解决方案。

更新: 经过一番酝酿,我终于得到了响应,但我无法得到 WebResponse()。现在我的代码生成“502 Bad gateway exception”。 这个新代码:

 Uri uri = new Uri(watchedStream.URL.Trim());
 WebRequest wr = WebRequest.Create("http://" + Dns.GetHostAddresses(uri.DnsSafeHost)[0].ToString() + ":1755");
 WebResponse = wr.GetResponse();

【问题讨论】:

  • 在阅读了建议的材料和我自己的询问后,这些是我的结果: 如果您想使用 .net 中不支持的 mms 和其他方案,请使用 Windows Media Foundation 或其一些社区端口到 .net。菲尔的建议是一个我没有足够的挑战。感谢你们两位的回答。

标签: c# .net


【解决方案1】:

通过查看MSDN page on WebRequest,特别是其继承,看起来这是因为 WebRequest 仅支持文件、http 和 ftp 方案。

编辑:我只是对 WebClient 进行了一些操作,看看它是否可以被哄骗下载一些数据,但它在幕后使用 WebRequest,所以你会得到相同的异常 :-( 但是,WebClient MSDN 页面上有一条评论这表明

默认情况下,.NET 框架 支持以 http: 开头的 URI, https:、ftp: 和文件:方案 标识符

我们已经知道了。但是上面有一条评论指出

WebClient 实例可以访问数据 与任何 WebRequest 后代 注册的 WebRequest.RegisterPrefix 方法。

这表明您应该能够创建一个实现IWebRequestCreate 的类,然后您可以注册它以支持 mms 方案,然后您就可以获取您的数据。 WebRequest.RegisterPrefix

【讨论】:

  • 我按照建议做了,但我做错了。我得到的只是 StackOverflowException :)!
  • 编写 WebRequest 继承者不是一件简单的事。一旦我得到一些工作,我会在这里发布。但如果有人有好的建议或可以分享一些经验,请这样做。
【解决方案2】:

问题在于 MMS 协议并不意味着(或支持)用作 URI。看来您应该将其用作“翻转 URL”。

见下文:

MMS Wikipedia

Eggheadcafe posting

【讨论】:

  • 感谢您提供的链接,这些链接帮助我意识到我的观点是多么狭窄。
【解决方案3】:

您可以使用WPF MediaElement 进行检查。

试试这个代码。

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                MediaElement me = new MediaElement();
                me.MediaEnded += me_MediaEnded;
                me.MediaFailed += me_MediaFailed;
                me.MediaOpened += me_MediaOpened;

                me.Source = new Uri("mms://95.0.159.131/TRTBELGESEL");

                mainGrid.Children.Add(me);
            }
            catch (Exception ex)
            {   
            }
        }

        void me_MediaOpened(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("OPENED"); //  It means OK!
        }

        void me_MediaFailed(object sender, ExceptionRoutedEventArgs e)
        {
            Debug.WriteLine("FAILED"); // It means that URL is not working
        }

        void me_MediaEnded(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("ENDED");
   }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多