最近在发布silverlight项目时,服务地址不是固定,因此服务需要动态创建。在网上搜了点资料找到了动态创建服务的方法,直接上代码
/// <summary>
/// 根据服务类型创建服务
/// </summary>
public static class CreateService
{
#region//动态创建服务
/// <summary>
/// 动态创建基本服务
/// </summary>
/// <typeparam name="serviceType">服务类型</typeparam>
/// <returns></returns>
public static T GetBasicService<T>(string serviceType) where T : class
{
T instance = null;
BasicHttpBinding bhb = new BasicHttpBinding();
string address = GetServerUrl(serviceType);
EndpointAddress endPointAddress = new EndpointAddress(address);
object[] paras = new object[2];
paras[0] = bhb;
paras[1] = endPointAddress;
ConstructorInfo constructor = null;
try
{
Type[] types = new Type[2];
types[0] = typeof(System.ServiceModel.Channels.Binding);
types[1] = typeof(System.ServiceModel.EndpointAddress);
constructor = typeof(T).GetConstructor(types);
}
catch (Exception)
{
}
if (constructor != null)
instance = (T)constructor.Invoke(paras);
return instance;
}
/// <summary>
/// 根据服务类型新建一个自定义服务实例
/// </summary>
/// <param name="serviceType">服务类型</param>
/// <returns></returns>
public static T GetCustomerService<T>(string serviceType) where T : class
{
T _instance = null;
string serviceUri = GetServerUrl(serviceType);
if (string.IsNullOrEmpty(serviceUri)) return null;
object[] paras = new object[2];
var elements = new List<BindingElement>();
elements.Add(new TextMessageEncodingBindingElement() { MessageVersion = MessageVersion.Default, WriteEncoding = Encoding.UTF8 });
HttpTransportBindingElement bindingElement = new HttpTransportBindingElement();
bindingElement.MaxReceivedMessageSize = int.MaxValue;
bindingElement.MaxBufferSize = int.MaxValue;
elements.Add(bindingElement);
CustomBinding binding = new CustomBinding(elements);
EndpointAddress address = new EndpointAddress(new Uri(serviceUri, UriKind.Absolute));
paras[0] = binding;
paras[1] = address;
ConstructorInfo constructor = null;
try
{
Type[] types = new Type[2];
types[0] = typeof(System.ServiceModel.Channels.Binding);
types[1] = typeof(System.ServiceModel.EndpointAddress);
constructor = typeof(T).GetConstructor(types);
}
catch (Exception)
{
return null;
}
if (constructor != null)
_instance = (T)constructor.Invoke(paras);
return _instance;
}
#endregion
#region//获取当前服务的地址
/// <summary>
/// 获取当前服务的URL
/// </summary>
/// <returns></returns>
private static string GetServerUrl(string serviceName)
{
return App.ServiceUriList[serviceName];
}
#endregion
}