在具有两个服务的WCF / MVC项目上使用“共享”类型(“无法从...转换”)

时间:2017-05-08 19:25:11

标签: c# asp.net-mvc wcf

我有两个WCF服务连接到我的客户端。我想使用从服务#1检索的User-object,并将其用作服务#2的参数。这是我的MVC控制器TournamentController.cs代码:

    private readonly GCTournamentServiceClient _tournamentClient = new GCTournamentServiceClient();

    public ActionResult Join(int id)
    {
        GCUserServiceClient userClient = new GCUserServiceClient();

        // Get current user
        var currentUser = userClient.GetUser(0);

        if (currentUser != null)
        {
            // Get selected tournament
            var selectedTournament = _tournamentClient.GetTournament(id);

            // Check if there are available seats in the tournament
            if (selectedTournament.Seats > selectedTournament.RegistredUsers.Count)
            {
                // Check if user exist amoung registred users
                if (!selectedTournament.RegistredUsers.Contains(currentUser))
                {
                    selectedTournament?.RegistredUsers.Add(currentUser);
                }
            }
        }
    }

错误Visual Studio提示我:

Argument 1: cannot convert from 'GConnect.Clients.WebClient.GCUserService.User' to 'GConnect.Clients.WebClient.GCTournamentService.User'

所以问题是currentUser,其类型为GCUserService.User。我无法将其用作RegistredUsers

的参数

错误本身非常有意义,但是,我不太确定我是如何转换此类型(正确)。有些文章指出,必须创建一个“共享”服务,它保存用户类型。我无法相信,这样的解决方案应该是必要的。

我可能在这里误解了一些基本的东西(使用WCF和MVC),但如果是这样的话,请赐教。

1 个答案:

答案 0 :(得分:0)

  

所以问题是currentUser,其类型为GCUserService.User。   我无法将其用作RegistredUsers的参数

有两种方法可以解决这个问题:

<强> 1) 创建一个类库项目(Visual Studio)并在该项目中添加$('#search').on('input',function(){ var found = false; $('ul li a span:first-child').each(function (i, el){ if ($(el).text() == $('#search').val()) { found = true; return; } }) console.log(found); }); 类,编译它并将其程序集(.dll)引用添加到服务和客户端(您的MVC应用程序)。接下来检索该用户对象,就像你已经在做的那样

User

GetUser将返回在单独程序集中定义的var currentUser = userClient.GetUser(0); 类型,该程序集将作为参考添加,如上所述。 User也将引用相同的程序集,TournamentService方法将采用相同的RegistredUsers.Add(User userToadd)对象,WCF运行时应该能够序列化/去除它。

<强> 2) 在您的MVC客户端应用程序中,新建User方法可接受的User对象。从TournamentService.RegistredUsers.Add填充其属性,并将该对象作为参数传递给currentUser方法。

最佳实践

理想情况下,我建议第一种方法是更多工作,但更好的做法,并且集中维护RegistredUsers.Add类,并重复使用代码。

希望这有帮助!