使用不同域时使用远程处理问题

时间:2009-04-17 22:43:11

标签: c# remoting

我有以下项目: 服务器,客户端,远程对象。客户端做某事,然后将远程对象的代理传递给服务器。在服务器和客户端位于不同的域之前,所有的东西都可以工作。现在,当我尝试将结果传递给服务器时,我有一个例外

  

“mscorlib.dll中发生了'System.Runtime.Remoting.RemotingException'类型的未处理异常

附加信息:此远程处理代理没有通道接收器,这意味着服务器没有正在侦听的已注册服务器通道,或者此应用程序没有合适的客户端通道与服务器通信。 “

互联网上的一些消息来源说我需要创建一些额外的频道,但我不知道我应该在哪里以及如何做到这一点因为我已经在服务器和客户端进行了频道注册。

Info:
server - domain 2
client - domain 1
remote object - domain 1

谢谢

2 个答案:

答案 0 :(得分:0)

听起来像是权限问题。你是如何托管远程对象的?您如何跨域进行身份验证? Here's a decent article您可能会遇到与auth有关的一些问题。

来自this article ...

默认情况下,TCP客户端通道使用运行客户端进程的用户标识对自身进行身份验证。您可以通过设置域,用户名和密码属性来指定备用标识,以指定备用标识

您是否在频道属性中指定了正确的凭据(包括域名)?

答案 1 :(得分:0)

  

然后传递远程对象的代理   到服务器

你能解释一下吗?这听起来不是一个好主意。通常,代理用于调用远程方法(RPC)。将代理传递回服务器是没有意义的。当然它可能在某些情况下有效,但它只会增加不必要的复杂性。

如果要传递对象,请创建一个单独的数据类,并将其作为参数传递给远程方法。

Common.dll

[Serializable]
public class Data
{
    int a;
    int b;
}
[Serializable]
public class ResultData
{
    int c;
}
public interface IServerInterface
{
    ResultData DoSomething(Data data);
}

Server.dll

public class ServerObject : MarshalByRefObject, IServerInterface
{
    public ResultData DoSomething(Data data)
    {
        // do some work on the server
        return new ResultData();
    }
}

Client.exe

class Program
{
    static void Main(string[] args)
    {
        IServerInterface proxy = CreateProxy();
        ResultData result = proxy.DoSomething(new Data());

    }
}