Silverlight WCF服务代理生命周期的主题对我来说不是很清楚.我在这里阅读了各种材料,资源和答案,但我仍然不完全理解使用它们的最佳方法.
我目前在Silverlight 4.0中使用自定义二进制绑定.
在silverlight中创建代理是一项昂贵的操作吗?我们应该尝试在代码中共享代理实例还是创建新代表更好?如果我们分享以防多个线程访问它,我们应该锁定吗?
由于代理上的错误会导致代理状态出错,我认为共享代理不是一个好主意,但我认为创建是昂贵的,所以它不是100%清楚这里要做什么.
关闭 - Silverlight WCF服务客户端只提供CloseAsync方法.代理还需要在关闭时使用某些逻辑(如果它们出现故障我们应该调用在Silverlight中同步的Abort(),如果不是,我们应该使用非同步的CloseAsync或什么?).
在许多官方的Silverlight样本中,来自MS代理的样本都没有被关闭,这只是材料的缺陷或预期的方法吗?
主题对我来说非常重要,我希望清楚地了解我目前没有应该考虑的所有事情.
(我确实看到这个问题Silverlight 3中WCF服务客户端代理的正常生命周期是什么?看起来接近我的但我不能说我对答案的质量感到满意)
我真的希望看到使用,创建,关闭等WCF代理的示例代码,最重要的是解释为什么这是最好的方法.我还认为(目前认为)由于问题的本质,应该有一个单一的,通用的最佳实践/模式 - 在Silverlight中使用(创建,重用,关闭)WCF代理的方法.
我有两个使用VS2008构建的.NET 3.5 WCF服务.
我在Silverlight中有两个WCF客户端来使用这些服务.使用"添加服务引用"生成客户端.我正在使用Silverlight 4.
其中一个代理是使用Specified每个属性的属性生成的.这是我的服务方法的'message-in'类:
// properties are generated for each of these fields
private long customerProfileIdField;
private bool customerProfileIdFieldSpecified;
private bool testEnvField;
private bool testEnvFieldSpecified;
Run Code Online (Sandbox Code Playgroud)
现在我的其他服务(仍然使用Silverlight客户端)不会生成Specified属性.
现在我不关心"良好SOA的原则".我只是想摆脱这些该死的属性,因为在我正在做的事情中我绝对讨厌它们.
两种服务之间必须有一些区别 - 但我不想完全撕掉它们以找出差异.
一个类似的问题之前有一个答案' 你不能这样做 ' - 这绝对不是真的,因为我有它 - 我只是不知道我做了什么不同.
编辑:我现在处于这样的情况:我将Silverlight 4代理重新生成到我的3.5 WCF服务(全部在同一个localhost机器上),有时我会获得"指定"属性,有时我不会.我不再认为(我最初怀疑)这仅仅是由于某些端点配置或服务级别[属性].消息本身中的某些触发器会导致生成(或不生成)Specified.可能涉及许多因素,或者可能是非常简单的因素.
有没有办法让Unity将属性注入的对象作为拆解的一部分进行处理?
背景是我正在使用ASP.NET MVC 2,Unity和WCF的应用程序.我们编写了自己的MVC控制器工厂,它使用unity实例化控制器,并使用控制器公共属性的[Dependency]属性注入WCF代理.在页面生命周期结束时,调用控制器工厂的ReleaseController方法,并调用IUnityContainer.Teardown(theMvcController).此时控制器按预期处理,但我还需要处理注入的wcf代理.(实际上我需要对它们调用Close和/或Abort而不是Dispose但这是后来的问题.)
我当然可以覆盖控制器的Dispose方法并清理那里的代理,但我不希望控制器必须知道注入接口的生命周期,甚至是它们引用WCF代理.
如果我需要自己编写代码 - 什么是最好的扩展点?我很欣赏任何指针.
我在网上找到了我的问题的混合答案.详细说明问题:
我发现很多博主和论坛海报相互矛盾.任何人都可以指出任何明确的消息来源或证据来一劳永逸地回答这个问题吗?
我使用WCF对SQL Server 2008 SSRS Web服务(.../reportserver/ReportService2005.asmx?wsdl)进行了子操作,据我所知,默认的WCF配置选项.
虽然它在生成本地代理类时做了一些奇怪的事情.
我将使用ListChildren方法作为示例:
在客户端,WCF会像您期望的那样生成这样的接口:
public interface ReportingService2005Soap {
ListChildrenResponse ListChildren(ListChildrenRequest request);
}
Run Code Online (Sandbox Code Playgroud)
它还生成一个实现该接口的"客户端"代理:
public partial class ReportingService2005SoapClient :
System.ServiceModel.ClientBase<ReportingService2005Soap>, ReportingService2005Soap
{
[EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
ListChildrenResponse ReportingService2005Soap.ListChildren(ListChildrenRequest request)
{
return base.Channel.ListChildren(request);
}
public ServerInfoHeader ListChildren(string Item, bool Recursive, out CatalogItem[] CatalogItems) {
ListChildrenRequest inValue = new ListChildrenRequest();
inValue.Item = Item;
inValue.Recursive = Recursive;
ListChildrenResponse retVal = ((ReportingService2005Soap)(this)).ListChildren(inValue);
CatalogItems = retVal.CatalogItems;
return retVal.ServerInfoHeader;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,客户端代理实现了接口,然后通过显式实现接口(因此必须强制转换为接口方法)以及另外使用EditorBrowsableState.Advanced属性来"隐藏"它.
然后它添加了一个使用'out'参数的额外包装器方法.
有没有办法停止,如果这样做,并让它直接实现接口?
它在这里做了什么导致你使用带有'out'参数的包装器方法的路径,然后你发现你不能非常容易地模拟服务,因为包装器方法不是虚拟的,并且没有在任何接口中定义.
注意:我在这里使用SSRS Web服务作为示例,但我已经看到WCF也在其他服务上执行此操作.
我有一个连接到第三方Web服务的WCF客户端代理.除了功能之外,代理几乎可以正常工作.
此功能适用于ASMX代理.
我添加了服务跟踪日志记录,可以看到服务返回的响应.只有代理返回null.
所以现在我确定代理是错的.
从哪里来?
决议 我发现了这个问题.WCF不如ASMX代理宽容.服务WSDL指定返回的对象称为"data",并且传回的实际xml称为"result"
这是一场伟大的追逐!我想我在这个问题上浪费了4个小时!