小编Mar*_*ark的帖子

使用WCF包装现有连接的流

我有双向连接的两端Stream,我想做一些沟通.流后面的底层实现并不重要,我想在这个Stream层面上工作......

我不想为流实现我自己的通信协议,而是希望使用所有现有的WCF优势来使用双向(请求/响应+回调)WCF通信通道来包装现有流.

我的问题是,我怎么能这样做......?

更新:

我走了实现自定义传输的道路.我有这个工作,但我仍然不是很满意它...

我已经实现了一个IDuplexSessionChannel包装流,以及适当的IChannelFactoryIChannelListener用于创建通道工厂的绑定元素.现在,我只是通过连接的流,并最终在创建它时将它们传递到传输通道.

所以,我可以通过流创建客户端代理来访问服务,如下所示:

var callback = new MyCallback();
var instanceContext = new InstanceContext( callback );
var pipeFactory = new DuplexChannelFactory<IMyService>( instanceContext, new StreamBinding(clientStream),
                                                        new EndpointAddress("stream://localhost/MyService"));
var serviceProxy = pipeFactory.CreateChannel();
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,似乎WCF设置为使用a ServiceHost创建通道的服务器端,通过IChannelListener.在我的情况下,我已经有一个连接流,我将无法再侦听任何传入的连接.我可以解决这个问题,但我宁愿不使用a ServiceHost来创建频道的服务器端,因为我最终得到了很多模糊的样板和黑客来使它工作.

问题

因此,我正在寻找更好的方法来获取IDuplexSessionChannels,并将它们包装到服务器端和客户端的Channel代理中.

或者可能是不需要的不同ServiceHost实现IChannelListener.

真的,这里的问题是我不想要单个服务器,多个客户端安排,我的WCF服务和客户端之间有1-1关系.有没有正确的方法来实例化其中一个?

换句话说,我想在不使用ServiceHost的情况下创建服务器端服务实例.

在此阶段,任何建议都将受到赞赏.

connection wcf custom-binding

17
推荐指数
1
解决办法
637
查看次数

注意MVVM纯粹主义者:ViewModel应该访问本地化资源吗?

我有时难以理解ViewModel的目的,特别是关于它应该和不应该做什么.

所以......我发现自己想要从我的ViewModel中公开一个显示字符串.好吧,实际上它是一个日期字符串,如果没有设置日期,我想显示"未知"之类的内容.我真的想要一个解决方案来涵盖一般情况,所以我不想讨论使用null和fallback值.它同样可以是"等待调度"或"启动中止"等状态消息.

问题是,ViewModel应该如何向View公开显示字符串.应用程序需要本地化,因此我们不能在ViewModel中使用硬编码字符串.

可以从ViewModel访问应用程序的资源,并返回显示字符串吗?

另外,我应该使用resx字符串资源还是Xaml资源字典?我倾向于Xaml.优点缺点?

谢谢,马克

wpf localization mvvm

11
推荐指数
2
解决办法
2625
查看次数

对WCF客户端的异步调用会阻止后续同步调用

我在客户端上调用生成的Async方法时遇到WCF问题...如果我等待异步方法,然后在同一客户端上调用非异步方法,则阻塞方法永远不会返回.

这是一个简单的问题再现:

[ServiceContract]
public interface IService1
{
    [OperationContract] void DoWork();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
    public void DoWork()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没什么复杂的.一个简单的WCF服务(同步实现),公开单个方法.

class Program
{
    static void Main(string[] args)
    {
        var svc = new ServiceHost(typeof(Service1));
        svc.Open();
        RunClient().Wait();    // This is a console app. There is no SynchronizationContext to confuse things.
        svc.Close();
    }

    static async Task RunClient()
    {
        var client = new ServiceReference1.Service1Client();
        client.DoWork();
        Console.WriteLine("Work Done");

        await client.DoWorkAsync();
        Console.WriteLine("Async Work Done");

        Console.WriteLine("About to …
Run Code Online (Sandbox Code Playgroud)

c# wcf deadlock asynchronous async-await

10
推荐指数
1
解决办法
805
查看次数

从异步任务中止当前进程

我有一些复杂的功能,这些功能在Task通过TPL生成的异步程序中运行,有时可能会以意外的方式失败。当发生此类故障时,这表示可能导致程序状态损坏的编程错误。因此,我不希望我的程序捕获异常,对其进行处理并“套用”,我希望我的进程崩溃并终止。

我还希望事情以Windows错误报告系统将其检测为崩溃的方式消亡,并进行所有有用的调试,例如捕获小型转储,将其发送给Microsoft等。

我知道这可能与您对程序在错误情况下应执行的操作的看法背道而驰,但问题不在于此。

我的问题是,由于任务引发异常,因此不会立即导致进程崩溃。一段时间后,当垃圾收集器明智地决定收集“未观察到”的异常时,它崩溃了。

我希望该过程立即崩溃,因为...

  • 实际错误中的调用堆栈和线程转储是我要在故障转储中收集的内容
  • 该进程“继续运行”并在不确定的时间后崩溃可能会导致进一步的损坏,因为它将在可能损坏的程序状态下工作
  • 用户对实际导致崩溃的操作感到困惑

简而言之,问题是:

如何使我的进程从Task使用TPL创建的async崩溃,从而Windows错误报告能够创建有用的小型转储?

提前致谢!

.net c# task-parallel-library windows-error-reporting

5
推荐指数
1
解决办法
545
查看次数

Dynamics CRM 2011 - 使用外部联接筛选LINQ查询

我要求查询CRM中没有某种类型的相关实体的记录.通常,我会使用左外连接执行此操作,然后筛选右侧有NULL的所有行.

例如:

var query = from c in orgContext.CreateQuery<Contact>()
            join aj in orgContext.CreateQuery<Account>()
                on c.ContactId equals aj.PrimaryContactId.Id
            into wonk
            from a in wonk.DefaultIfEmpty()
            where a.Name == null
            select new Contact
                   {
                       FirstName = c.FirstName,
                       LastName = c.LastName,
                   };
Run Code Online (Sandbox Code Playgroud)

这应该返回任何不是帐户主要联系人的Contats.但是,此查询最终会返回所有联系人...!当您查看在SQL事件探查器中生成的SQL时,它会显示如下:

SELECT cnt.FirstName, cnt.LastName
FROM Contact as cnt
    LEFT OUTER JOIN Account AS acct
        ON cnt.ContactId = acct.PrimaryContactId AND acct.Name is NULL
Run Code Online (Sandbox Code Playgroud)

所以,我得到的左连接OK,但过滤器Join条款,而不是在WHEREclause.and没有,因为它应该是这样的:

SELECT cnt.FirstName, cnt.LastName
FROM Contact as cnt
    LEFT OUTER …
Run Code Online (Sandbox Code Playgroud)

linq dynamics-crm dynamics-crm-2011

2
推荐指数
1
解决办法
6227
查看次数