2

ユーザー定義のクラスをソケットに渡します。SendObjectコードは以下のとおりです。ローカルマシンでは機能しますが、Webサーバーに公開すると、自分のマシンのアプリケーションサーバーと通信できなくなります。

    public bool SendObject(Object obj, ref string sErrMsg)
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf1 = new BinaryFormatter();
            bf1.Serialize(ms, obj);
            byte[] byArr = ms.ToArray();
            int len = byArr.Length;
            m_socClient.Send(byArr);
            return true;
        }
        catch (Exception e)
        {
            sErrMsg = "SendObject Error: " + e.Message;
            return false;
        }
    }

ツールプロジェクトの1つのクラスであり、UserDataに関する他のクラスが知りたくない場合は、これをうまく行うことができます。イライラする!

ああ。UserDataクラスの中にDataSetがあるからだと思います。おかしなことに、私はこの作品を見てきましたが、1回のリクエストの後、ループが発生し、再び動作させることができなくなりました。

なぜこれが起こるのか誰もが知っていますか?dllを比較して、Webサーバーとローカルマシンで同じであることを確認しました。AssemblyInfo.csでバージョン管理をオンにして再確認したので、同じように見えます。

考えられる原因は、シリアル化と逆シリアル化の間の無効なストリームまたはオブジェクトのバージョン変更です。


編集

問題はサイズにあるようです。1024バイト未満に保つと(ここで推測しています)、Webサーバー上で機能し、内部にDataSetがある場合は機能しません。k実際、これは非常に不可解で、ds.GetXml(を使用してDataSetを文字列に変換しました。 )そしてこれはまたそれを爆破させます。:(それで、ネットワーク全体で私のソケットの何かが間違っていて、データを読みたくないようです。

4

1 に答える 1

1

これは、私がここに投稿したより良い質問によって解決されます:

バイト配列を拡張しようとした場合にのみ、ソケットを介して大きなシリアル化されたオブジェクトを送信すると失敗しますが、大規模なバイト配列を使用する場合は問題ありません

明らかに、おもちゃの例から持ち上げた静的バッファーがありましたが、入力されたデータセットを渡し始めたとき、それらは大きすぎました。私が抱えていたいくつかの動的バッファの問題に対する答えもこれをカバーしています。

于 2010-03-09T16:18:33.607 に答える