1

wsdl.exeを使用して、巨大なwsdlファイルからWebサービスプロキシコードを自動生成しています。次に、生成された.csファイルをdllにコンパイルし、プログラムで使用してWebサービスを呼び出します。

問題は、プログラムでsqlセッション状態を使用すると、proxxyオブジェクトをセッション状態に保存できないことです。wsdl.exeで生成されたファイルのメインクラスをシリアル化可能とマークしましたが、シリアル化できないSystem.Web.Services.Protocols.SoapHttpClientProtocolを継承しているため、問題ありませんか?

自動生成されたコードをセッション状態で動作させる方法を知っている人はいますか?

4

1 に答える 1

1

通常、 WSDLサービスラッパーではなく、状態(エンティティ)をシリアル化します。2.0以降のほとんどのcode-genは、ファイルをpartialクラスとして書き込みます。つまり、2番目のコードファイルを追加して、属性などを追加できます。

namespace MyNamespace
{
    [Serializable] partial class Customer {}
    [Serializable] partial class Order {}
    [Serializable] partial class Address {}
}

これは、wsdlで生成されたタイプの残りの半分と組み合わさBinaryFormatterれており、から使用できるようになるはずです。ただし、個人的には、これは悪い方法だと思います。wsdl.exeを使用しているため、タイプはすでに。を介してシリアル化できますXmlSerializer。それらをでシリアル化する代わりにBinaryFormatter(これはデフォルトで使用され、非常に脆弱です)、またはを介しXmlSerializerてそれらをシリアル化することを検討し、それをセッション状態に追加します。これは余分なコード変更なしで機能し、の複数の脆弱なポイントを回避するため、はるかに堅牢です。stringbyte[]BinaryFormatter

例えば:

static string SerializeXml<T>(T obj) where T : class
{
    if (obj == null) return null;
    StringWriter sw = new StringWriter();
    using (XmlWriter xw = XmlWriter.Create(sw))
    {
        new XmlSerializer(typeof(T))
            .Serialize(xw, obj);
    }
    return sw.ToString();
}
static T DeserializeXml<T>(string xml) where T : class
{
    if (xml == null) return null;
    using (XmlReader xr = XmlReader.Create(new StringReader(xml)))
    {
        return (T)new XmlSerializer(typeof(T))
            .Deserialize(xr);
    }
}
于 2009-10-14T03:59:05.727 に答える