web-dev-qa-db-ja.com

このエラーについて知っている人はいますか:「間違ったローカルヘッダー署名:0x6D74683C」?

次のコードは、Zipファイルをダウンロードして電話で解凍するために使用されます。

WP7で動作していたのと同じコードで、WP8デバイスでテストを開始しましたが、奇妙なことが起こっています...現在WP8で動作しますが、[〜#〜 ] not [〜#〜]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
}

出力スタック

    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
15
wafers

ヘッダーコード0x6D74683Cは、ASCIIシーケンス<htmに対応します。これは、Webページの切り捨てられたHTMLヘッダーであると推測されます。Zipアーカイブのコンテンツをダウンロードする場合は、おそらく、Webサーバーが目的のアーカイブ(エラーページなど)ではなくHTMLコードを返していることを意味します。ストリームをICSharpCode.SharpZipLibにフィードする前に、HTTPContent-Typeヘッダーを確認する必要があります。

15
Leandro

WP7を使用すると、dropboxからhtmlを受け取ります。

見つかりました

リソースは{"ここに新しいリンク}が見つかりました。自動的にリダイレクトされます。------------------------------- ----- WSGIサーバー

Wp8ではithisリダイレクトは自動的に機能しますが、Wp7ではこのリダイレクトは機能しません。

私はあなたのための解決策だと思います:リンクを新しいものに変更するだけです(あなたが受け取ったhtmlファイルでそれを見つけることができます)

4
d.lavysh

問題は、回答で説明されている「LeandroTaset」と「d.lavysh」と同じでした。しかし、なぜWP7が追加のHTMLヘッダーを取得するのかはまだ不明です。

とにかく、変更されたコードは現在、WP7デバイスとWP8デバイスの両方で機能しています。このコードはWebホスティングサービスまたは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);
    }
1
wafers