.NET からサードパーティの SOAP API を使用しようとしています。いつものように、C# プロキシ クラスを生成してそれを呼び出したところ、すべて正常に動作しました。
その後、ベンダーと話をしたところ、テナント (データベース) を切り替えるには、別の XML 名前空間を指定する必要があることがわかりました。問題は、名前空間がプロキシ コードに組み込まれていることです。匿名バージョン:
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Web.Services.WebServiceBindingAttribute(
Name="eStrangeAPI", Namespace="urn:wsTenantSpecific")]
public partial class eTimeWSService : System.Web.Services.Protocols.SoapHttpClientProtocol {
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("",
RequestNamespace="urn:wsTenantSpecific:eStrange",
ResponseNamespace="urn:wsClientSpecificNamespace:eStrange", ...]
...
public string methodCall(ref Param param) {
...
}
wsTenantSpecific
そのため、現在使用中のアカウントに応じて名前空間を変更する必要があります。クラスの属性を取得して、その場で変更できます...
var attr = ((WebServiceBindingAttribute[])
typeof( eTimeWSService ).GetCustomAttributes(
typeof( WebServiceBindingAttribute ), false ))[ 0 ];
attr.Namespace = "urn:wsADifferentNameSpace";
...しかし、これがどれほどスレッドセーフであるかが心配です。複数のアカウントを同時に接続し、同じプロセス内の異なるスレッドで ASP.NET 要求を実行することができました。
要点: 属性を変更すると、プロセス全体または現在のスレッドのみが変更されますか?