범용 반사를 사용하여 런타임 시 동적으로 WCF 클라이언트 만들기

12535 단어 WCF
만약에 우리가 WCF 서비스의 URL,binding,contractType을 알고 있다면 우리는 아래의 코드를 사용하여 WCF 클라이언트 대상을 만들 수 있습니다.
ChannelFactory<ITaskService>.CreateChannel(new BasicHttpBinding(),new EndpointAddress(url));

그러나 위의 코드에서 우리는 BasicHttpBinding의 설정 가능한 설정을 할 수 없다. 이때 우리는 아래의 코드를 사용하여 App.와 협조할 수 있다.Config 를 통해 Binding 정보를 구성할 수 있습니다.
ChannelFactory<ITaskService>.CreateChannel(new BasicHttpBinding("BasicHttpBinding_TaskService"),new EndpointAddress(url));
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_TaskService" closeTimeout="00:01:00"
openTimeout
="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies
="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize
="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding
="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy
="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead
="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm
="" />
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>

그러나 상기 방법은 모두 정태적으로 완성된 것이다. 우리는 동태적으로 WCF 클라이언트 대상을 만드는 것을 실현할 방법이 있습니까?
    var service1 = GetWcfClient(url, new BasicHttpBinding(), typeof(ITaskService)) as ITaskService;
var service2 = GetWcfClient(url, new BasicHttpBinding("BasicHttpBinding_TaskService"), typeof(ITaskService)) as ITaskService;
    public static object GetWcfClient(string url, Binding binding, Type contractType)
{
Type channelFactoryGenericType = typeof(ChannelFactory<>).MakeGenericType(new Type[] { contractType });
MethodInfo method = channelFactoryGenericType.GetMethod("CreateChannel", new Type[] { typeof(Binding), typeof(EndpointAddress) });
return method.Invoke(null, new Object[] { binding, new EndpointAddress(url) });
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_TaskService" closeTimeout="00:01:00"
openTimeout
="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies
="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize
="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding
="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy
="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead
="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm
="" />
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>

좋은 웹페이지 즐겨찾기