問題タブ [wcf-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - WCF Operation.Contextはスレッドセーフではありませんか?
WCF サービスのコードをレビューしています。各メッセージのヘッダーに、サービスが後で DB への接続文字列を構築するために使用するデータを挿入します。これは、サービスが多数の異なるサイトで使用され、それぞれがサービスが照会する必要がある独自の DB を持っているためです。wcf 拡張性を使用します。リクエストを受信した後、メッセージ ヘッダーからデータを抽出し、(IExtension を実装する) コンテキストを作成し、それを OperationContext.Current.Extensions に追加するカスタム MessageInspector があります。返信を送信する前に、カスタム コンテキストが Extensions コレクションから削除されます。
ここで説明するように、これはかなり一般的なパターンです。
現在の WCF 呼び出しのデータをどこに保存しますか? ThreadStatic は安全ですか?
そしてここ:
サービスがリクエストを受け取り、それを処理し、返信を送信し、次のリクエストを受信する限り、これはすべて正常に機能します。しかし、サービスがリクエストを受信し、応答する前に 2 番目のリクエストを受信した場合はどうなるでしょうか? テスト用に小さなコンソール アプリケーションを作成しました。2 つの異なるスレッドから 2 つのメッセージを送信します。最初のリクエストが完了する前に 2 番目のリクエストが確実に届くように、wcf サービスを 2 秒間待機させました。
サイト ID : test1450 ; セッション: uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70;id=2: スレッド ID: 6
サイト ID : test1450 ; セッション: uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70;id=3: スレッド ID: 22
wcf は 2 つの異なるスレッドで実行される 2 つのセッションを作成するように見えますが、サイト ID は同じです。すべきではありません。このことから判断すると、OperationContext.Current.Extensions はスレッド間で共有されるコレクションのように見えます。今、私は自分のテストが間違っていて、何かを見逃していると思いがちです。
同様のことを試した人はいますか? OperationContext.Current がスレッドセーフではないことがわかりましたか?
wcf - WCF - メッセージと MessageBuffer を閉じる
Msdn は次のように述べています。メッセージは、破棄時に本文の構築に使用されたオブジェクトも破棄します。
これから私が推測するのは、 Message を閉じていることであり、それが作成された MessageBuffer も閉じます。しかし、実際のコードではそうではありません。メッセージを閉じると、messagebuffer.closed が false のままになります。
メッセージ バッファとそのバッファから作成されたメッセージを閉じる方法は?
c# - IServiceBehavior/IOperationBehavior を実装する属性から OperationContext を取得する方法
以下のように、WCF サービスを保護するために IServiceBehavior を実装する属性があります。
問題は、メッセージ ヘッダーを取得することです。現在の OperationContext を取得する必要がありますが、ApplyDispatchBehavior 内でそれを行う方法がわかりません。安全な方法でそれを行うと、機能します。
c# - WCF: IErrorHandler で一般的な FaultException を提供する
いくつかのコンテキスト: カスタム XSD があり、WSCF.blue を使用して WSDL および C# コードを生成します。クライアント側はChannelFactory<T>
、XSD の内容と一致するように WSCF.blue によって追加されたすべての属性を含むインターフェースを使用および共有します。
IErrorHandler.ProvideFault
generic を提供する場所を実装しようとしていますFaultException<T>
が、クライアント側では非ジェネリックを取得していますFaultContract
。これは私のProvideFault
方法がどのように見えるかです:
各サービスメソッドで、try/catch を実行すると期待どおりに動作するので、 、ファクトリ、バインディングなどはすべて正しいthrow FaultExceptionFactory.CreateFaultException(ex)
と思います。[FaultContract]
念のため、工場の仕組みは次のとおりです。
IErrorHandler
問題は、メッセージが で、おそらく で作成される方法にあると思いますCreateMessageFault()
。faultException.Action
アクションはの代わりにすべきだと読みnull
ましたが、実際faultException.Action
にはnull
です。たぶん、これが問題の原因です。ファクトリでアクションを設定できますが、アクションはどうあるべきで、なぜそれが手動スローで表示されないのでしょうか?
私が見逃している可能性のある他のアイデアはありますか?
編集: WSDL を確認したところ、呼び出していた特定の操作とそのアクションが見つかりました。
action:Message.CreateMessage(..., "http://myNamespace/MyMethodBusinessRuleFaultExceptionTypeFault")
をハードコーディングして、工場で に設定しようとし.Action
ましたが、それでもうまくいきませんでした。
編集 2: throw/catch は、クライアントで一般的な例外をキャッチできる次の XML を生成します。
はIHttpErrorHandler
、非ジェネリックに行く以下を生成しますFaultException
:
編集 3:とを
に追加する[DataContract]
と、ほぼ正しい XML が得られます。[DataMember]
BusinessRuleFaultExceptionType
Code と Reason の名前空間がありません。少なくともこれで絞れると思います。通常のシリアル化では and を使用し、 では[XmlType]
and[XmlElement]
をIErrorHandler
使用[DataContract]
してい[DataMember]
ます。残念ながら[DataMember]
、名前空間を設定することはできません。そのため、問題は .xml で XMLSerializer を使用する方法だと思いますIErrorHandler
。これは私の問題を説明していますが、上記の理由で修正は機能しません: http://twenty6-jc.blogspot.com/2011/05/ierrorhandlerprovidefault-serialization.html
編集 4:
問題を部分的に見つけました。を使用してXmlSerializer
いIErrorHandler
ますが、運用範囲外のため、デフォルトの に戻しますDataContractSerializer
。解決策は、サービスをどこでも使用するように変更するか、障害を作成するときにDataContractSerializer
手動で選択することです。XmlSerializer
これらの 2 つの記事は、私が必要としていたものを提供してくれました。
http://twenty6-jc.blogspot.com/2011/05/ierrorhandlerprovidefault-serialization.html http://zamd.net/2008/08/15/serializing-faults-using-xmlserializer/
それは私を非常に近づけます。例外タイプの名前空間がないことを除いて、これは作業中の XML と同じです。
xmlns="http://myNamespace/Services"
リクエストのコンテキストがないため、追加されないと思います。その名前空間はインターフェイスで定義されていますが、データ コントラクトでは定義されていません。IOperationInvoker
を使用する代わりに、リクエストのコンテキスト内にとどまることを本当に強制されるのIHttpHandler
でしょうか(うまくいけばうまくいきます)。
c# - クライアント側で送信メッセージのプロパティを動的に追加するための WCF 拡張機能
複数の操作を持つ WCF サービスを使用しています。このサービスでは、その操作のいずれかを呼び出すたびに、送信メッセージ プロパティを追加する必要があります。
現時点では、コード内でサービスを呼び出すたびにプロパティを追加しています。
これを行うための私のコードは次のとおりです。
これらのメッセージ プロパティを動的に追加する WCF 拡張機能を作成するにはどうすればよいですか?
拡張機能についての知識はほとんどありませんが、これらのヘッダーを傍受して追加するのに十分ではありません。
c# - WCF カスタム エンコーダー - 実行時にメッセージ コンテンツ タイプを割り当てる
現在、メッセージを解析する独自の WCF エンコーダーを構築しています。返信を送信するときに割り当てられるコンテンツ タイプを動的に変更したいのですが、彼が探している場所がわかりません。
彼は CustomTextEncoder.ContentType またはインナーエンコーダーのコンテンツ タイプを使用していますか? 「text/xml」または「application/soap+xml」として応答を送信するように強制するにはどうすればよいですか?
前もって感謝します。
編集-カスタムエンコーダーのWriteMessageメソッドで決定する必要があることを明確にするために。要求されたコンテンツ タイプを保持する文字列プロパティを使用していますが、彼はそれを正しく行っていません。
残念ながら、メッセージを送信すると、彼はまだエンコーダーのデフォルト値を割り当てています...
asp.net-mvc - StructureMap 例外 202
WCF サービスと MVC 4 アプリケーションで StructureMap を使用しています。両方で構成しましたが、アプリケーションを実行すると、次の例外が発生します。
StructureMap 例外コード: 202 PluginFamily のデフォルト インスタンスが定義されていませんバージョン=1.0.0.0、カルチャ=ニュートラル、PublicKeyToken=null
はLookupRepository
抽象クラス、ジェネリック クラスです。これを登録する方法は次のとおりです。
でレジストリを呼び出すGlobal.asax
:
それでも私は例外を得ました。理由はありますか?
注: StructureMap バージョン 2.6.4.0