#wcf #binding #endpoint
#wcf #привязка #конечная точка
Вопрос:
У меня есть прокси WCF, созданный во время выполнения с помощью DuplexChannelFactory.
Как я могу получить доступ к информации о привязке, учитывая только интерфейс службы, возвращаемый из DuplexChannelFactory?
Я могу получить большую часть информации, приведя к IClientChannel, но, похоже, я не могу найти там информацию о привязке. Ближайшее, что я могу получить, это IClientChannel.remoteAddress, который является конечной точкой, но, похоже, у него также нет информации о привязке. :-/
Ответ №1:
Вы не можете (напрямую). Есть несколько вещей, которые вы можете получить из канала, такие как версия сообщения ( channel.GetProperty<MessageVersion>()
) и другие значения. Но привязка не является одной из этих. Канал создается после того, как привязка «деконструирована» (т. Е. расширена на свои элементы привязки, в то время как каждый элемент привязки может добавить еще одну часть в стек каналов.
Однако, если вы хотите иметь информацию о привязке в канале прокси, вы можете добавить ее самостоятельно, используя одно из свойств расширения контекстного канала. Приведенный ниже код показывает один из примеров этого.
public class StackOverflow_6332575
{
[ServiceContract]
public interface ITest
{
[OperationContract]
int Add(int x, int y);
}
public class Service : ITest
{
public int Add(int x, int y)
{
return x y;
}
}
static Binding GetBinding()
{
BasicHttpBinding result = new BasicHttpBinding();
return resu<
}
class MyExtension : IExtension<IContextChannel>
{
public void Attach(IContextChannel owner)
{
}
public void Detach(IContextChannel owner)
{
}
public Binding Binding { get; set; }
}
static void CallProxy(ITest proxy)
{
Console.WriteLine(proxy.Add(3, 5));
MyExtension extension = ((IClientChannel)proxy).Extensions.Find<MyExtension>();
if (extension != null)
{
Console.WriteLine("Binding: {0}", extension.Binding);
}
}
public static void Test()
{
string baseAddress = "http://" Environment.MachineName ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
host.Open();
Console.WriteLine("Host opened");
ChannelFactory<ITest> factory = new ChannelFactory<ITest>(GetBinding(), new EndpointAddress(baseAddress));
ITest proxy = factory.CreateChannel();
((IClientChannel)proxy).Extensions.Add(new MyExtension { Binding = factory.Endpoint.Binding });
CallProxy(proxy);
((IClientChannel)proxy).Close();
factory.Close();
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}