我构建了一个软件,使用用户加载到软件中的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)。
谢谢
答案 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上试过,它工作正常,不确定你的应用程序是否正常。所以请告诉我它是否适用于您的应用程序,也许我可以帮助您进行调试