

UnityのC#(Mono)でサーバー側でgzip圧縮されたデータをHttpWebRequestのGetResponse()メソッドを使用して受け取りたいです。

下記のソースの  
**using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse())**  
を実行すると、  
**DllNotFoundException: MonoPosixHelper**  
というエラーが出てレスポンスを受け取ることができません。

調査したところ、MonoにはGZipStreamの名前空間はいるようなのですが実装部はいないようです。  
※なぜならコンパイルは通りますが、GzipStreamを使用しようとすると落ちるのでInterFaceのみいるのではないかと思ってます。

リクエスト側はIonic.Zip.CF.dllを使用してgzip圧縮し、サーバー側にデータを送信する事はできたのですが、下記スタックトレースを見たところGetResponse()メソッドはSystem.IO.Compression.GZipStream
をコールするようにできているみたいで回避する方法がわかりません。

開発環境：Windows7 Unity5.0.2f1

  
●ソースコード

[code]

    string serialized = Json.Serialize(JsonDataDic);
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("APIのURL");
    
    req.ContentType = "application/json; charset=UTF-8";
    req.Method = "POST";
    req.Accept = "application/json";
    req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    req.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip");
    byte[] text = Encoding.UTF8.GetBytes(serialized);
    byte[] compress = Compress(text);
    req.ContentLength = compress.Length;
    // データの設定
    var s = req.GetRequestStream();
    s.Write(compress, 0, compress.Length);
    s.Close();
    
    HttpWebResponse wresa = (HttpWebResponse)req.GetResponse();
    
    using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse())
    {
        using (Stream st = wres.GetResponseStream())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                byte[] buffer = new byte[4096];
                int count = 0;
                do
                {
                    count = st.Read(buffer, 0, buffer.Length);
                    memoryStream.Write(buffer, 0, count);
    
                } while (count != 0);
                string str = Encoding.UTF8.GetString(memoryStream.ToArray());
    
                var deserializedDoubleList = Json.Deserialize(str) as Dictionary<string, object>;
            }
        }
    }
    
[/code]

●スタックトレース

[code]

    DllNotFoundException: MonoPosixHelper
    System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip)
    (wrapper remoting-invoke-with-check) System.IO.Compression.DeflateStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode,bool,bool)
    System.IO.Compression.GZipStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen)
    System.IO.Compression.GZipStream..ctor (System.IO.Stream compressedStream, CompressionMode mode)
    (wrapper remoting-invoke-with-check) System.IO.Compression.GZipStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode)
    System.Net.HttpWebResponse..ctor (System.Uri uri, System.String method,     System.Net.WebConnectionData data, System.Net.CookieContainer container)
    (wrapper remoting-invoke-with-check) System.Net.HttpWebResponse:.ctor (System.Uri,string,System.Net.WebConnectionData,System.Net.CookieContainer)
    System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data)
    Rethrow as WebException: MonoPosixHelper
    System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
    System.Net.HttpWebRequest.GetResponse ()
    
[/code]


CC BY-SA 3.0
2015-06-06T08:38:14.443
11040
2021-01-20T00:08:55.883
5261
question
c# unity3d
C#(Mono)でgzip圧縮データをHttpWebRequest.GetResponseで取得するには


`Accept-Encoding:
gzip`を含まないようにリクエストを作り、サーバー側でgzip圧縮して返してもらうことで、圧縮したデータを送り・圧縮されたデータを受け取るAPIが実現できました。

* * *

この投稿は @user3732298
さんの[コメント](https://ja.stackoverflow.com/questions/11040/cmono%e3%81%a7gzip%e5%9c%a7%e7%b8%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92httpwebrequest-
getresponse%e3%81%a7%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af#comment10170_11040)などを元に編集し、[コミュニティWiki](https://ja.meta.stackoverflow.com/q/1583)として投稿しました。


CC BY-SA 4.0
2021-01-20T00:08:55.883
73419
2021-01-20T00:08:55.883
9820
11040
answer