重定向中的.NET XML支持(301,302)

时间:2014-05-04 09:44:42

标签: .net xml redirect

我构建了一个软件,使用用户加载到软件中的XML文件从Web下载文件,以便直接从软件下载文件。 这是用于从MSE(反病毒)下载最新更新的用户将加载的XML文件的示例:

<?xml version="1.0" encoding="utf-8"?>


<Software Name="MSE 64">
    <Address Name = "http://go.microsoft.com/fwlink/?LinkID=121721&arch=x64">
        <File Name = "mpam-feX64.exe" Store = "yes"/>
        <File Name = "mpas-fe.exe" Store = "yes"/>
        <File Name = "mpam-fe.exe" Store = "yes"/>
    </Address>
</Software>

我面临的问题是,有时地址是重定向网址的地址,所以我需要能够支持我的XML软件中的重定向,我该怎么做?

这就是守则:(无论如何都是其中的一部分)

static void Update(XElement stage, string folder, string contextAddress, string contextFile)
    {
        switch (stage.Name.LocalName.ToLower())
        {
            case "file":
                string currentFile;
                if (stage.Attribute("Name") != null) currentFile = stage.Attribute("Name").Value;
                else if (stage.Attribute("Pattern") != null)
                {
                    Regex re = new Regex(stage.Attribute("Pattern").Value, RegexOptions.IgnoreCase | RegexOptions.Multiline |
                        (stage.Attribute("Instance") != null && stage.Attribute("Instance").Value.ToLower() == "last" ? RegexOptions.RightToLeft : 0));
                    Match m = re.Match(File.ReadAllText(contextFile));
                    if (!m.Success) throw new FileNotFoundException("A file name couldn't be matched");
                    currentFile = m.Groups.Count > 0 ? m.Groups[0].Value : m.Value;
                }
                else break;

                contextFile = Path.Combine(folder, Path.GetFileName(currentFile).Length > 0 ? Path.GetFileName(currentFile) : Path.GetFileName(contextAddress));
                string tempFile = Path.GetTempFileName();
                try
                {
                    using (WebClient wc = new WebClient())
                    { wc.DownloadFile(Uri.IsWellFormedUriString(currentFile, UriKind.Absolute) ? currentFile : contextAddress + '/' + currentFile, tempFile); }
                    lock (stage.Ancestors("Software").First().Annotation<System.Threading.Timer>())
                    { File.Delete(contextFile); File.Move(tempFile, contextFile); }
                }
                finally { File.Delete(tempFile); }
                break;

            case "address":
                if (stage.Attribute("Name") != null)
                {
                    string currentAddress = stage.Attribute("Name").Value;
                    contextAddress = Uri.IsWellFormedUriString(currentAddress, UriKind.Absolute) ? currentAddress : contextAddress + '/' + currentAddress;
                }
                break;

            case "software": break;

            default: return;
        }

(支持HTTP响应状态代码301&amp; 302)。

谢谢

3 个答案:

答案 0 :(得分:1)

您需要阅读HTTP状态代码并对其进行操作。

编辑:

您可以从WebClient捕获状态代码,并根据HTTP响应给出的位置创建一个设置新网址的开关。

答案 1 :(得分:1)

如果您使用的是WebClient.DownloadFile(),它将自动跟踪重定向。

答案 2 :(得分:0)

请尝试以下代码:

HttpWebRequest myHttpWebRequest=(HttpWebRequest)WebRequest.Create("http://go.microsoft.com/fwlink/?LinkID=121721&arch=x64");    
myHttpWebRequest.MaximumAutomaticRedirections=1;
myHttpWebRequest.AllowAutoRedirect=true;
HttpWebResponse myHttpWebResponse=(HttpWebResponse)myHttpWebRequest.GetResponse();

我在asp.net上试过,它工作正常,不确定你的应用程序是否正常。所以请告诉我它是否适用于您的应用程序,也许我可以帮助您进行调试