好的,我必须将带有 Silverlight 组件的 ASP.NET 应用程序部署到多个暂存环境。该应用程序依赖于属于不同项目的 Wcf 服务,但应始终托管在与我的项目相同的服务器上(尽管在不同的端口上)。我不想每次部署到新环境时都必须记住在 ServiceReferences.ClientConfig 文件中修改服务端点的地址。由于无法为一个项目指定多个 ServiceReferences.ClientConfig(s)(就像您可以使用 Web.Config(s) 一样),我遵循了这里的建议在我的 ServiceReferences.ClientConfig 中为每个环境创建一个引用。然后,我将所需端点的名称指定为我的主项目的 Web.config 中的设置,并将其作为初始参数传递给 Silverlight 组件。这是我碰壁的地方。我使用 slsvcutil 为我的 Web 服务生成异步客户端。据我所知,将所需端点地址传递给我的服务客户端的唯一方法是通过其构造函数。以下是典型服务调用的示例:
yield return new WebServiceResult<ServiceClient, MethodCallCompletedEventArgs>
(
client => client.MethodNameAsync(param1, param2, ...),
result => { .... }
);
这是类 WebServiceResult 的缩写定义。
public class WebServiceResult<T, K> : IResult
where T : new()
where K : EventArgs
{
private readonly Action<K> _callback;
private readonly Expression<Action<T>> _serviceCall;
private ActionExecutionContext _currentContext;
public WebServiceResult(Expression<Action<T>> serviceCall, Action<K> callback)
{
_serviceCall = serviceCall;
_callback = callback;
}
public void Execute(ActionExecutionContext context)
{
_currentContext = context;
var lambda = (LambdaExpression)_serviceCall;
var methodCall = (MethodCallExpression)lambda.Body;
var eventName = methodCall.Method.Name.Replace("Async", "Completed");
var eventInfo = typeof(T).GetEvent(eventName);
var service = new T();
eventInfo.AddEventHandler(service, new EventHandler<K>(OnEvent));
_serviceCall.Compile()(service);
}
public void OnEvent(object sender, K args)
{
if (_callback != null) _callback(args);
}
}
由于泛型 T 被限制为具有无参数构造函数的东西,我应该如何指定所需端点地址的名称?