異なるシステムはWebサービスのインタラクティブプロジェクトに関連するいくつかの知識点を利用しています.

13052 ワード

最近はプロジェクトをしていますが、WebServiceを利用して異なるシステム間のインタラクションが必要です.その中で多くの技術的な知識を学びました.多くのものはやはり本当の実践の中で問題を発見して解決します.次はいくつか挙げます.
シーン
システムAは外部ネットワークにあり、システムBは内部ネットワークにあり、AはBにメッセージを送る必要があり、BではXML形式に適合したraw文字列に従ってBでいくつかの動作を行う.Aは外网にあるので、A上でenable SSLを配置し、Aのサーバーにproxyのようなwebserviceを配置しました.そこで、Aにwebserviceを配置しました.
1です.データ構造は、方法のパラメータ、戻り値だけがクライアントでプロキシクラスを生成し、このプロキシ類は元のデータタイプの方法を含んでいない.
もともとはAとBのwebserviceで使いたいタイプがあります.二つの項目はこのModelのDLLを引用しました.
一つはModel一つです.しかし、コンパイルが間違っています.Aはこのタイプが二つのNamespaceに存在します.(AはBのwebserviceを引用していますので、A右はこのModelのDLLを引用しています.似たような****.proxy.のnamespaceとdll自身のnamespaceがあります.)このModelのDLLは必要なくなりました.このプロジェクトに移ることもできます.AはこのWebserviceを引用すれば、自然に代理クラスを生成しました.
方法はエージェントでは生成されません.パッケージ性のためにpartialクラスで解決できます.
2.IComparable
私たちのデータの種類は、List<MyType>のような集合形式で存在します.このリストはType李のあるフィールドによって並べ替えられます.このタイプはIComparableインターフェースを継承してもいいです.効率的に考えれば、范型のインターフェースを継承できます.
class MyType:IComparable<MyType>

{

  public int CompareTo(MyType)

  {



    return ******;

  }

}
 
そして、自分のSort()を呼び出すだけで、方法は自分で並べ替えられます.
3.Webserviceは、ディベート、hashtableなど、いくつかのパラメータタイプについて
似たような機能を満たすには自分で定義するしかないです.
[Serializable]

public class SMSFKeyValuePair

{

    public string Key { get; set; }

    public decimal Value { get; set; }

}
4、もしブラウザを通してテストしたいなら、例えばQAにテストページをあげます.webserviceでxml形式の文字列を伝えたいです.安全のため、runtimeはblockというrequestがあります.
自分で注文したいです.custom validator.
public class CustomRequestValidator : RequestValidator

{

        //force web service accept xml string type parameter and skip the request validation 

        protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)

        {

            // Set a default value for the out parameter.

            validationFailureIndex = -1;

            return true; 

        }

 }
同時にwebconfigを設定します.
<httpRuntime request Validation Type=「Mercer.SMSF.SMSFExternal WebSeriv.C.ustomRequest Validator.」
5.ASPNETはIP lockdownの機能を持っています.webconfigの中に配置すればいいです.
<system.webServer>

    <security>

      <ipSecurity allowUnlisted="false">

        <clear/>

        <add ipAddress="127.0.0.1" allowed="true"/><!-- allow requests from the local machine -->

        <add ipAddress="123.200.169.186" allowed="true"/>

        <add ipAddress="220.157.70.222" allowed="true"/>

      </ipSecurity>

    </security>

    <modules runAllManagedModulesForAllRequests="true"/>

</system.webServer>
6.Webserviceの非同期問題
Aのwebserivceのmethod 1で何かをしたら、Bのwebserviceのmethod 2を呼び出します.そして、method 1は短い時間で帰る必要がありますが、method 2はまた時間がかかります.どうすればいいですか?元々はmethod 1でmehod 2の非同期のその方法を呼び出したら、method 1はすぐにclient 2に戻ってきます.同期効果と同じです.単独のwebseriveメソッドで呼び出しても、非同期のその方法ですぐに戻るはずです.ここに二階がありますので、だめです.その後、method 1にスレッドを立てて、method 2を呼び出すと、この予想通りの効果が得られます.この間にポイント.netの非同期プログラムを見て、使ってみました.
//start a async task to generate result package 

Task.Factory.StartNew((o) =>

            Method2(o), mytype)

            .ContinueWith((t) =>

            {

              ExceptionManager.Publish(t.Exception);

            },

            TaskContinuationOptions.OnlyOnFaulted);
7.xmlプログレッシブ
クライアントにxml形式の文字列を返す必要がある場合、どうすればいいですか?構造はxmlに似ているタイプを定義できます.最後にこのオブジェクトを並べてください.
このタイプの属性はどのようにカスタマイズしますか?生成されたxml文字列の中でnodeですか?それともinneratextですか?それともatributeですか?また、nodenameをどのようにカスタマイズしますか?atributem.System.Xml.Serializationの下で多くのatributeを定義できます.
Xml Root、XmlElement、Xml Attribute、Xml Text、それらは順番にxmlstringの中のを溶けないでXmlIgnoreを使うことができます.
もう一つの問題があります.CDATAタイプが必要ですが、ネットフレームは現在このタイプを支持していません.どうすればいいですか?自分で来られます.
[Serializable]

    public class CDATA : IXmlSerializable

    {

        private string text;



        public CDATA()

        {

        }



        public CDATA(string text)

        {

            this.text = text;

        }



        public System.Xml.Schema.XmlSchema GetSchema()

        {

            return null;

        }



        public void ReadXml(System.Xml.XmlReader reader)

        {

            this.text = reader.ReadString();

        }



        public void WriteXml(System.Xml.XmlWriter writer)

        {

            writer.WriteCData(this.text);

        }

    }
たとえば、CommentsフィールドはCDATAに序列化する必要があります.まずComment属性を決めます.CDATAComment属性もあります.序列化時にはignore Commentという属性があります.
private string comment;

[XmlIgnore]

public string Comment

{

    get

    {

        return comment;

    }

    set

    {

        comment = value;

        CDataComment = new CDATA(comment);

    }

}

[XmlElement(ElementName = "comment", Type = typeof(CDATA))]

public CDATA CDataComment { get; set; }
それから、私はこのタイプの対象を序列化したいです.拡張方法をここで練習しました.そして、このようなXmlの序列化には多くのところが必要です.模範的な方法を書きました.
public static class PackageExtension

{

        public static string OutputXML<T> (this T instance) where T:IMyXmlSerializable

        {

            StringBuilder sb = new StringBuilder();

            Type type = typeof(T);

            XmlSerializer serializer = new XmlSerializer(type);

            XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();

            xmlns.Add(String.Empty, String.Empty);

            XmlWriterSettings settings = new XmlWriterSettings();

            settings.Indent = true;

            using (XmlWriter xmlWriter = XmlWriter.Create(sb))

            {

                serializer.Serialize(xmlWriter, instance, xmlns);

            }

            return sb.ToString();

        }

}
IMyXml Serializableは何ですか?この時はただ一つの標識です.つまり、このインターフェースのタイプを引き継いでこそ、この拡張方法を呼び出すことができます.この制限を加えないと、すべての種類が呼出できます.当然、エラーが発生します.だから、私がxmlのシーケンス化を必要とするクラスにこのインターフェースを継承すればいいです.このインターフェースは空いています.
public interface IMyXmlSerializable

{

}
8.Webconfig protocols設定問題
VS走りだしwebserviceでもテストできますが、配備が無理です.見てください.
http://support.microsoft.com/kb/815150
http://msdn.microsoft.com/en-us/library/b2c0ew36%28v=vs.71%29.aspx
ミリ秒はローカルにHttpPostLocastを追加しました.