0

MVC4 シリアライゼーションの問題

現在、プロジェクトのサーバー側コードを処理するために MVC4 を使用しています。基本的な MVC スタイルを使用して、オブジェクトのリストをクライアント アプリケーションに送信することを目指しています。

サーバー

つまり、基本的な get 要求を処理する関数を備えた "Controller" クラスがあります。

その関数は次のとおりです。

    /// <summary>
    /// The installer(uninstaller in this case), will need the known malicious programs.
    /// </summary>
    /// <param name="User_ID"></param>
    /// <param name="UC"></param>
    /// <param name="Implementation_ID"></param>
    /// <returns>Sends a serialized list of extensions as an object that will be shared.</returns>
    [HttpGet]
    [ValidateInput(false)]
    public ActionResult SendExtensions(Guid User_ID, string UC, string Implementation_ID)
    {
        System.Diagnostics.Debug.WriteLine("----Send Serialized Malicious Extensions----");
        string ipAddress = Utility.GetIPAddress();
        System.Diagnostics.Debug.WriteLine("IP: " + ipAddress);
        string Country = GeoIPHelper.GetCountryCode(ipAddress);
        System.Diagnostics.Debug.WriteLine("Country: " + GeoIPHelper.GetCountryCode(ipAddress));
        System.Diagnostics.Debug.WriteLine("User ID: " + User_ID);
        System.Diagnostics.Debug.WriteLine("User Class: " + UC);
        System.Diagnostics.Debug.WriteLine("Implementation ID: " + Implementation_ID);
        try
        {
            using (ValidationManager manager = new ValidationManager())
            {
                System.Diagnostics.Debug.WriteLine("Getting data from DB.");
                //Grab the users installed malicious applications. (Extensions + Programs)
                List<CheckUserExtensionsResult> userExts = manager.CheckUserExtensions(User_ID);

                //using (var stream = new StreamWriter(Request.InputStream))
                {
                    //Convert the list into an object.
                    List<BlockedExtension> sList = ConvertToSerializableList(userExts);
                    //Serializer.
                    BinaryFormatter serializer = new BinaryFormatter();
                    //Send the serialized object.
                    serializer.Serialize(Request.InputStream, sList);
                }

            }
        }
        catch (Exception ex)
        {
            _log.Error(ex.Message, ex);
        }

        return new EmptyResult();
    }

クライアント

クライアント アプリケーションには、ユーザー ID を送信して、悪意のある拡張機能のリストを取得する機能があります。

    /// Grab a list of the installed malicious extensions.
    public static void GetMalicousExtensions(string User_ID, string UC, string Implementation_ID)
    {
        try
        {

            //         Debug
            System.Diagnostics.Debug.WriteLine("GetMalExt Running");
            WebRequest request = WebRequest.Create(string.Format("http://localhost:35555/Secure/SendExtensions?User_ID={0}&UC={1}&Implementation_ID={2}"
                , User_ID
                , UC
                , Implementation_ID
                ));

            System.Diagnostics.Debug.WriteLine("Request made.");
            request.Method = "GET";

            System.Diagnostics.Debug.WriteLine("Method set.");
            request.Timeout = 10000;//10 seconds for debug, switch to 5 for release.

            System.Diagnostics.Debug.WriteLine("Serializer initialized.");
            BinaryFormatter serializer = new BinaryFormatter();

            System.Diagnostics.Debug.WriteLine("Getting the stream.");
            var mList = (serializer.Deserialize(request.GetResponse().GetResponseStream()));
            //request.
            System.Diagnostics.Debug.WriteLine("GetMalExt deserialized");

        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Exception: " + ex.Message);
        }
    }
    ///

シリアライズ可能なオブジェクト

シリアル化されるデータは、悪意のある拡張機能に関するデータを保持するクラスであり、現在は悪意のある拡張機能の名前のみを格納しています。それにもかかわらず、これが送信されるクラスです。注: 実際にはシリアライズ可能なオブジェクトのリストを送信していますが、それが問題を引き起こしているかどうかはわかりません。

    ///
///For testing, this should be moved to a shared file.
[Serializable()]
public class BlockedExtension : ISerializable
{
    string Extension_Name = "";
    public BlockedExtension(string Extension_Name)
    {
        this.Extension_Name = Extension_Name;
    }
    public BlockedExtension(SerializationInfo info, StreamingContext ctxt)
    {

    }
    public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
    {

    }
}

ついに!質問:

したがって、できる限り多くの背景を説明した後、問題はシリアル化されたデータを送受信するときです。関数を正常に呼び出して、両端で応答を取得しますが、シリアル化されたデータを送信するときが来ると、両側でエラーが発生します。

クライアント エラー: これはデバッグ コンソールからのものです

  • ストリームを取得します。
  • タイプ 'System.Runtime.Serialization.SerializationException' の初回例外例外 - - mscorlib.dll で発生しました
  • 例外: 解析が完了する前にストリームの終わりが検出されました。

サーバーエラー:これはデバッグコンソールからのものです

  • ----シリアル化された悪意のある拡張子を送信----
  • IP:::1
  • 国: -
  • ユーザー ID: d0ba65e1-b840-49cb-bbbb-002077050cd2
  • ユーザークラス: 567
  • 実装 ID: テスト
  • DBからデータを取得しています。
  • タイプ 'System.ArgumentException' の初回例外が mscorlib.dll で発生しました

MVC4 を介してシリアル化されたデータを送信することに関する技術文書は、実際には見つけられなかったので、オープンです。これらはすべて、さまざまな種類のアプリケーションのスニペットを使用してまとめられています。この件に関して私が見つけたドキュメントのほとんどは、TCP 接続で使用するためのものであり、このアプリケーションには設定したくありません。

この問題に関する任意の助けをいただければ幸いです。

4

1 に答える 1