は、私は、私が追加したためにカスタム動作受信場所のBizTalk WCF-カスタムを持っている:これはhttps://code.msdn.microsoft.com/How-to-integrate-BizTalk-07fada58#contentで発見サンプルから構成されている簡潔WCFが私のTokenProviderを無視するのはなぜですか?
ため省略
public class SasTokenProviderEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sharedAccessSecretName, sharedAccessKey);
bindingParameters.Add(new TransportClientEndpointBehavior { TokenProvider = tokenProvider });
}
}
}
パラメータ設定コードを - この著者はBizTalkコミュニティで広く尊敬されており、この種のコードは数年間使用されています。私がやっているのは、彼が使用している方法が、動作することが証明されている方法を、別のTokenProviderに置き換えることです。
このコードが実行され、正しいパラメータを持つTransportClientEndpointBehaviorがチャネルに追加されていることを、デバッグを通じて確認できます。しかし、BizTalkがサービスバスをポーリングすると、イベントログに次のようなメッセージが表示されます。
アダプタ「WCF-Custom」がエラーメッセージを表示しました。詳細: "System.UnauthorizedAccessException:40102:リソース:sb:// [namespace] .servicebus.windows.net/[queue]。TrackingId:452c2534-d3e6-400f-874f-09be324e9e11_G27、SystemTracker:[名前空間]。 [System.ServiceModel.FaultException:40102:権限トークンが存在しない、Resource:sb:// [namespace] .servicebus .windows.net/[キュー]。TrackingId:452c2534-d3e6-400f-874f-09be324e9e11_G27、SystemTracker:[名前空間] .servicebus.windows.net:[キュー]、タイムスタンプ:12/1/2016 11:38:56 AM
Azure Service Busエンドポイントがこのエラーメッセージを返す理由は何もわかりませんが、トークンプロバイダが使用されていないため、トークンプロバイダを無視するのはなぜですか?トークンは正しくありますか?
編集:私は期待どおりに動作SB-メッセージングアダプターを使用して問題になっているポートだけでなく、1、のために生のWCFメッセージトラフィックを検査している
。違いは、SB-メッセージングアダプターのメッセージには、
<Authorization xmlns="http://schemas.microsoft.com/servicebus/2010/08/protocol/">SharedAccessSignature sr=[really long encoded string]</Authorization>
のようなSOAPヘッダーがあり、私のカスタムバインディングポートのメッセージには含まれていないという点です。したがって、この問題はAuthorization SOAPヘッダーがないことは事実です。問題は解決されません。なぜ、このヘッダーを追加していないのですか?
編集#2:
私はMicrosoft.ServiceBus.dllを逆コンパイルしていると私は私が実際にWCFのmesssage、Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageCreator
を作成するクラスを見つけたと信じています。それは、このメソッドを持っています
private Message CreateWcfMessageInternal(string action, object body, bool includeToken, string parentLinkId, RetryPolicy policy, TrackingContext trackingContext, RequestInfo requestInfo)
{
Message message = Message.CreateMessage(this.messageVersion, action, body);
MessageHeaders headers = message.Headers;
headers.To = this.logicalAddress;
string sufficientClaims = this.GetSufficientClaims();
if (this.linkInfo != null)
{
if (!string.IsNullOrEmpty(this.linkInfo.TransferDestinationEntityAddress))
{
SecurityToken authorizationToken = this.GetAuthorizationToken(this.linkInfo.TransferDestinationEntityAddress, sufficientClaims);
if (authorizationToken != null)
{
SimpleWebSecurityToken webSecurityToken = (SimpleWebSecurityToken) authorizationToken;
if (webSecurityToken != null)
this.linkInfo.TransferDestinationAuthorizationToken = webSecurityToken.Token;
}
}
this.linkInfo.AddTo(headers);
}
if (includeToken)
{
ServiceBusAuthorizationHeader authorizationHeader = this.GetAuthorizationHeader(sufficientClaims);
if (authorizationHeader != null)
headers.Add((MessageHeader) authorizationHeader);
}
if (this.messagingFactory.FaultInjectionInfo != null)
this.messagingFactory.FaultInjectionInfo.AddToHeader(message);
if (!string.IsNullOrWhiteSpace(parentLinkId))
message.Properties["ParentLinkId"] = (object) parentLinkId;
if (trackingContext != null)
TrackingIdHeader.TryAddOrUpdate(headers, trackingContext.TrackingId);
MessageExtensionMethods.AddHeaderIfNotNull<RequestInfo>(message, "RequestInfo", "http://schemas.microsoft.com/netservices/2011/06/servicebus", requestInfo);
return message;
}
だから、それについて考え、論理的に、Authorizationヘッダが欠落していることになる二つの理由があります。
includeToken
はfalseです(なぜこれがそうだろう?)GetAuthorizationHeader()
をnullを返します(なぜ?)
編集#3:
サンプルコードをコンパイルして実行しましたが、これは機能します。
var kv = new KeyVaultClient(this.GetAccessToken);
var key = kv.GetSecretAsync(this.KeyVaultUri.AbsoluteUri, this.SharedAccessSecretName).Result;
var sharedAccessKey = key.Value;
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
this.SharedAccessSecretName,
sharedAccessKey);
bindingParameters.Add(new TransportClientEndpointBehavior { TokenProvider = tokenProvider });
これは、タスクを返す非同期メソッドである:私のコードと彼の間の唯一の大きな違いは私はアズールキーVaultにアウト呼び出す行が含まれていることです。このタスクの結果をブロックすることで、特定の状況で何が起こるのか何とかできないことがあります。これは何とかWCFチャネルの設定を乱すことになりますか?私が言ったように、私はこのコードが実行され、TokenProviderを割り当てていると確信しています。が実行されているとき、私は今は特定のではない。
ポートが実行されているホストインスタンスにVisual Studioを接続してデバッグを試みましたか? – Dijkgraaf
@Dijkgraafはい、そういうわけで、TokenProviderがどこにあるかが割り当てられていることを自分自身で証明できます。私にとっては、通常のサービスバスのシナリオでは、この作業を行うための「何か」を行う特別なチャネルファクトリが存在するのに対し、おそらくBizTalkには標準のChannelFactoryまたはBizTalkベースのものがあり、特定のものについては何も知らないでしょう。私は今調査する立場にはいませんが、私はこの可能性をある時点でフォローアップします。 –
私は以前の主張を実証しなければならない例を通して私の道を進んでいます - これが事実であると確信しています。 [この例](https://code.msdn.microsoft.com/Brokered-Messaging-WCF-0a526451)は、Service BusシナリオがWCFで動作するためには、CustomBinding.BuildChannelFactoryを呼び出す必要があることを示しています。これは実際にチャネルを作成するためにトランスポートバインディング要素に委譲します。ユニットテストでこれを呼び出すと、ServiceBusChannelFactoryが返されます.WCFアダプタはこれをしません**。これがPaoloの 'SessionChannelBindingElement'が重要な理由だと私は信じています。 –