Кто-нибудь знает об этой ошибке: "Неверная локальная подпись заголовка: 0x6D74683C"?
Следующий код используется для загрузки zip файла и разархивирования его на телефоне.
Тот же код, который использовался для работы с WP7, я начал тестировать на устройстве WP8, и странная вещь происходит... теперь она работает на WP8, но не на WP7.
На WP7 он дает ОШИБКА:
Wrong Local header signature: 0x6D74683C
Может ли кто-нибудь сказать мне, что здесь не так?
НАБЛЮДЕНИЕ (через 2 дня после публикации вопроса)
У меня есть некоторые замечания... Здесь подробно (Формат изображения) или (Формат Excel)
КОД
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Diagnostics;
using System.IO;
using System.IO.IsolatedStorage;
using System.Net;
namespace iq_main.Network
{
public class IQ_Download
{
private string zipFilePassword = String.Empty;
private string fileNameToBeStoredAs = String.Empty;
private string urlToBeDownloaded = String.Empty;
private HttpWebResponse response;
public void Download(string _urlToBeDownloaded = GlobalConstants.DownloadLanguageConfigurationUrl, string _fileNameToBeStoredAs = GlobalConstants.DownloadLanguageConfigurationXmlFilename, string _zipFilePassword = GlobalConstants.DownloadZipsPassword)
{
urlToBeDownloaded = _urlToBeDownloaded;
fileNameToBeStoredAs = _fileNameToBeStoredAs;
zipFilePassword = _zipFilePassword;
System.Uri targetUri = new System.Uri(urlToBeDownloaded);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUri);
request.BeginGetResponse(new AsyncCallback(WebRequestCallBack), request);
}
void WebRequestCallBack(IAsyncResult result)
{
HttpWebRequest resultInfo = (HttpWebRequest)result.AsyncState;
response = (HttpWebResponse)resultInfo.EndGetResponse(result);
try
{
using (StreamReader httpwebStreamReader = new StreamReader(response.GetResponseStream()))
{
//open isolated storage to save files
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
using (ZipInputStream s = new ZipInputStream(httpwebStreamReader.BaseStream))
{
if (zipFilePassword != String.Empty)
s.Password = zipFilePassword;//if archive is encrypted
ZipEntry theEntry;
try
{
//EXCEPTION OCCURS ON THE VERY NEXT LINE (while...)
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
fileName = fileNameToBeStoredAs;
// create directory
if (directoryName.Length > 0)
{
isoStore.CreateDirectory(directoryName);
//Directory.CreateDirectory(directoryName);
}
if (fileName != String.Empty)
{
//save file to isolated storage
using (BinaryWriter streamWriter =
new BinaryWriter(new IsolatedStorageFileStream(theEntry.Name,
FileMode.Create, FileAccess.Write, FileShare.Write, isoStore)))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
}
}
}
}
catch (ZipException ze)
{
Debug.WriteLine(ze.Message);
}
}
}
}
} //try
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}//WebRequestCallBack Method */
} //Class ends
}
OUTPUT STACK
Step into: Stepping over method without symbols 'string.operator !='
Step into: Stepping over method without symbols 'ICSharpCode.SharpZipLib.Zip.ZipInputStream.Password.set'
Step into: Stepping over method without symbols 'string.operator !='
Step into: Stepping over method without symbols 'ICSharpCode.SharpZipLib.Zip.ZipInputStream.Password.set'
Step into: Stepping over method without symbols 'ICSharpCode.SharpZipLib.Zip.ZipInputStream.GetNextEntry'
A first chance exception of type 'ICSharpCode.SharpZipLib.Zip.ZipException' occurred in SharpZipLib.WindowsPhone7.dll
Step into: Stepping over method without symbols 'System.Exception.Message.get'
Step into: Stepping over method without symbols 'System.Diagnostics.Debug.WriteLine'
Wrong Local header signature: 0x6D74683C
A first chance exception of type 'ICSharpCode.SharpZipLib.Zip.ZipException' occurred in SharpZipLib.WindowsPhone7.dll
Wrong Local header signature: 0x6D74683C
Ответы
Ответ 1
Код заголовка 0x6D74683C соответствует последовательности ASCII <htm
, которая, как я полагаю, является усеченным заголовком HTML на веб-странице. Если вы загружаете содержимое архива .zip, возможно, это означает, что веб-сервер возвращает HTML-код вместо предполагаемого архива (страница с ошибкой или что-то в этом роде). Возможно, вам нужно проверить заголовок HTTP Content-Type перед подачей потока в ICSharpCode.SharpZipLib.
Ответ 2
Когда вы используете WP7, вы получаете html из dropbox:
Найдено
Ресурс был найден в {"вашей новой ссылке здесь}, вы должны быть автоматически перенаправляется. ------------------------------------ WSGI Server
В Wp8 перенаправление iithis работает автоматически, но в Wp7 это перенаправление не работает.
Я думаю, что решение для вас: просто измените ссылку на новую (вы можете найти ее в html файле, который вы получите)
Ответ 3
Проблема была такой же, как "Leandro Taset" и "d.lavysh" объяснили в своих ответах. Однако неизвестно, почему WP7 получает дополнения HTML-заголовки?
В любом случае, модифицированный код, который теперь работает как для WP7, так и для WP8-устройств. Этот код также способен загружать файлы либо из службы веб-хостинга, либо из DropBox.
Код, который я написал выше, почти то же самое, я только изменил метод Download
, который после модификации выглядит следующим образом:
public async void Download(string _urlToBeDownloaded = GlobalConstants.DownloadLanguageConfigurationUrl, string _fileNameToBeStoredAs = GlobalConstants.DownloadLanguageConfigurationXmlFilename, string _zipFilePassword = GlobalConstants.DownloadZipsPassword)
{
//The following IF block is addition to the code above.
//Here the headers are checked and if "WP7" and the URL is pointing to the "Dropbox", the inner URL is fetched out of the headers.
if (GlobalVariables.IsWP7 && _urlToBeDownloaded.ToLower().Contains("dropbox"))
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_urlToBeDownloaded);
HttpWebResponse webResponse = await webRequest.GetResponseAsync() as HttpWebResponse;
for (int i = 0; i < webResponse.Headers.Count; ++i)
{
if (webResponse.Headers.AllKeys[i].ToLower() == "location")
{
_urlToBeDownloaded = webResponse.Headers["location"] ;
break;
}
}
}
urlToBeDownloaded = _urlToBeDownloaded ;
fileNameToBeStoredAs = _fileNameToBeStoredAs;
zipFilePassword = _zipFilePassword;
System.Uri targetUri = new System.Uri(urlToBeDownloaded);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUri);
request.BeginGetResponse(new AsyncCallback(WebRequestCallBack), request);
}