IExtension을 사용하여 클라이언트를 사용중인 클라이언트에서 매개 변수를 취하는 클라이언트 측 동작을 만들었습니다. 그리고 내 접근 방식이 작동하는 동안 나는 더 나은 방법을 원합니다.WCF 프록시 비헤이비어 및 매개 변수
지금 내가하려는 일을 명확히하기 위해 현재 진행중인 접근 방식에 대한 세부 사항을 공유 할 것입니다.
프록시를 사용하는 클라이언트는 다음과 같이 매개 변수를 제공 다음 IExtension ParameterHolder
는 다음과 같다
var client = new ServiceAlphaClient();
client.InnerChannel.Extensions.Add(new ParameterHolder("hello"));
client.DoSomething("some interesting service invocation");
client.Close();
:
public class ParameterHolder: IExtension<IContextChannel>
{
public string someParam;
public ParameterHolder(string someParam)
{
this.someParam = someParam;
}
#region IExtension required-but-useless stuff
public void Attach(IContextChannel owner)
{
}
public void Detach(IContextChannel owner)
{
}
#endregion
}
파라미터를 사용하여 클라이언트 측 행동 확장과 같다
:
#region IClientMessageInspector
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
//throw new NotImplementedException();
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
ParameterHolder holder = channel.Extensions.Find<ParameterHolder>();
string param = holder.someParam;
request.Headers.Add(MessageHeader.CreateHeader(headerName, headerNamespace, someParam));
return null;
}
#endregion
내가 위에 모두에 대해 싫어하는 것 :
- ClientMessageInspector 확장은 나가는 요청마다 Extensions.Find를 반복적으로 호출합니다. 그것은 불필요하고 비효율적입니다.
- 내 프록시를 사용하는 클라이언트는 생성 된 새로운 프록시마다 매개 변수를 제공해야합니다. 첫 번째 문제에 관해서는
의 관리자 확장에 나는 저장할 수 있고 더 나은 효율성을 위해 값에 대한 테스트,하지만 난 오히려 초기 단계에서 한 번만이 매개 변수를 가져올 수있을 것입니다. 특히 IContractBehavior 자체가 AddBindingParameters (...) 또는 ApplyClientBehavior (...)에서 매개 변수를 가져올 수 있도록하고 싶습니다. 하지만 거기에서 클라이언트 채널에 도달하는 방법을 모르겠습니다.
두 번째 문제에 대해서는 Extensions.Add()를 사용하여 각 프록시 인스턴스에 매개 변수를 설정하지 않는 것이 좋습니다. 매개 변수를 클라이언트에 정적으로 설정할 수 있으면 좋겠다. 여하튼 여전히 동작 확장명을 다시 가져 와서 가져오고 싶습니다. 부분 수업을 활용하는 방법을 잘 모릅니다.
어쨌든 이러한 문제를 해결하려면? "메타 매개 변수"를 WCF 프록시에 전달하는 전반적인 더 나은 방법이 있습니까?