gpt4 book ai didi

.net - 在 silverlight 上异步调用同步 WCF 操作协定方法

转载 作者:行者123 更新时间:2023-12-04 20:53:23 25 4
gpt4 key购买 nike

我们通过使用 ChanellFacotry 创建代理在 silverlight 应用程序槽上使用 wcf 服务。

Operation 和 Data 合约暴露在 silverlight trough 组件中,该组件由来自服务器端 Data 和 Operation 合约库的共享文件组成。 (天哪,我希望你明白我在说什么)。

因此服务器和客户端使用相同的操作和数据合约。

如您所知,Silverlight wcf 客户端库有一个限制,即不能同步调用 wcf 方法,因此共享操作契约(Contract)文件必须公开每个操作的异步版本。

如果它们不包含阻塞操作,那么编写异步 WCF 服务会很有意义,但是当我们使用 EF 时,异步是通过将阻塞工作委托(delegate)给线程池来实现的。无论如何,这就是 WCF 为同步方法所做的。而这个事实让我想撕掉我的眼睛(#@%!^%!@%)。

我们的项目顾问有权不允许在客户端生成动态代理来调用同步操作合约方法(如果您有兴趣,请谷歌 Yevhen Bobrov Servelat Pieces)。所以我们必须在服务器端编写异步方法的感觉实现,而没有任何性能提升(你记得阻塞调用)。

是否可以使用 Silverlight 的数据合约调用 wcf Web 服务同步方法?

你以前有没有遇到过这个问题,如果有,你是怎么解决的?

目前,我期待仅使用服务器端合约作为转换源为客户端生成异步合约。也许有一些 t4 模板可以很好地为我做到这一点?

对不起,文字墙,只是为了将一些代码混合到我的问题中,这就是异步合约实现现在的样子:

    /// <summary>
/// Subscribes to users of the specified organization.
/// </summary>
/// <param name="organizationId">The organization id.</param>
public void Unsubscribe(int organizationId)
{
var clientId = this.OperationContext.GetClientId();
if (string.IsNullOrEmpty(clientId))
{
return;
}

this.InternalUnsubscribe(organizationId, clientId);
}

/// <summary>
/// Begins an asynchronous operation to Unsubscribe.
/// </summary>
/// <param name="organizationId">The organization id.</param>
/// <param name="callback">The callback.</param>
/// <param name="passThroughData">The pass through data.</param>
/// <returns>
/// An implementation of <see cref="IAsyncResult"/> that provides access to the state or result of the operation.
/// </returns>
public IAsyncResult BeginUnsubscribe(int organizationId, AsyncCallback callback, object passThroughData)
{
var clientId = this.OperationContext.GetClientId();
if (string.IsNullOrEmpty(clientId))
{
return null;
}

var asyncResult = new VoidAsyncResult(callback, passThroughData);
Task.Factory.StartNew(() =>
{
try
{
this.InternalUnsubscribe(organizationId, clientId);
asyncResult.SetAsCompleted(false);
}
catch (Exception ex)
{
asyncResult.SetAsCompleted(ex, false);
}
});
return asyncResult;
}

/// <summary>
/// Ends an existing asynchronous operation to Unsubscribe.
/// </summary>
/// <param name="result">The <see cref="IAsyncResult"/> provided by the BeginUnsubscribe operation.</param>
public void EndUnsubscribe(IAsyncResult result)
{
var response = result as VoidAsyncResult;
if (response != null)
{
response.EndInvoke();
}
}

最佳答案

您无需将 WCF 服务编写为异步。您只需为定义 Async 方法的服务创建一个 ServiceContract。这是一个简单的例子

[ServiceContract]
public interface IMyService
{
[OperationContract]
int Foo(string input);
}

//tell wcf that this contract applies to IMyService
[ServiceContract(Name = "IMyService")]
public interface IMyServiceAsync
{
//setting AsyncPattern = true allows WCF to map the async methods to the sync ones.
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginFoo(string input, AsyncCallback callback, object asyncState);

int EndFoo(IAsyncResult result};
}

// you only need to implement the sync contract
public class MyService : IMyService
{
public int Foo(string input)
{
return input.Length;
}
}

现在将 IMyServiceAsync 与您的 ChannelFactory 一起使用,一切都应该正常工作。

关于.net - 在 silverlight 上异步调用同步 WCF 操作协定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7648249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com