将json数据从客户端传递到服务

时间:2013-01-28 13:16:09

标签: json wcf service client

我正在尝试将RESTful架构添加到现有的SOAP服务中,因此我同时拥有Rest和SOAP兼容服务。我正在使用WebGets和WebInvokes访问服务接口中的现有方法。从方法签名中可以看出,Object作为参数传递,Object从方法返回。这就是为什么跟随http://www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSON我使用Json作为消息格式。在chrome addon Advanced Rest Client中,有一个很好的功能,即在POSTing查询时发送json数据。但是我无法理解的是我的系统中的客户端在调用此服务时应该如何发送Json数据?

这是来自客户的电话:

client.GenerateInvitation(sessionId, email, loggedInstitution);

服务接口:

[OperationContract]
        [WebInvoke( Method = "POST",ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json,
        UriTemplate = "Rest/GenerateInvitation?ses={sessionId}&em={email}"]
        PartialInvitation GenerateInvitation(string sessionId, string email, Institution  institution);

这是数据合同:

  public partial class Institution
      {

    [DataMember]
        public System.Guid Guid { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Phonenumber { get; set; }
    }

这是一个实现的方法GenerateInvitation:

public PartialInvitation GenerateInvitation(string sessionId, string email, Institution institution)
        {
            Session session = GetSession(sessionId);
            if (session != null)
            {
                if (((  session.User.Institutions.Where(i => i.Guid ==             institution.Guid).FirstOrDefault() != null &&
                                session.User.AccessLevel == ACCESS_LEVEL_MED
                            ) ||  session.User.AccessLevel == ACCESS_LEVEL_HIGH
                        ) && EmailTools.IsValidEmail(email) )
                {
                    List<User> usersWithMatchingEmail = db.Users.Where(u => u.Email == email).ToList();

                    foreach (User usr in usersWithMatchingEmail)
                    {
                        if (session.User.AccessLevel == ACCESS_LEVEL_MED)
                        {
                            if (usr.AccessLevel != ACCESS_LEVEL_LOW) throw new InvalidOperationException("Cannot invite non trainees");
                        }
                        if (session.User.AccessLevel == ACCESS_LEVEL_HIGH)
                        {
                            if (usr.AccessLevel == ACCESS_LEVEL_HIGH) throw new InvalidOperationException("Admin's cannot invite each other, they have full power without invitations");
                        }
                    }
                    List<Invitation> invitations = db.Invitations.Where(i => i.Email == email).ToList();
                    Invitation invitation = invitations.Where(i => i.Institution.Guid == institution.Guid).FirstOrDefault();
                    if (invitation == null)
                    {
                        invitation = new Invitation
                        {
                            Guid = Guid.NewGuid(),
                            Email = email,
                            Institution = db.Institutions.Where(i => i.Guid == institution.Guid).FirstOrDefault(),
                            InvitationCode = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8).ToUpper(),
                            InvitedOn = DateTime.Now,
                            ExpiresOn = DateTime.Now.AddDays(INVITATION_EXPIRY_DAYS),
                            InvitedBy = session.User
                        };

                        while ((db.Invitations.Where(i => i.InvitationCode == invitation.InvitationCode).FirstOrDefault()) != null)
                        {
                            invitation.InvitationCode = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8).ToUpper();
                        }

                        if (invitation.Institution != null)
                        {
                            db.Invitations.Add(invitation);
                            db.SaveChanges();
                            SendInvitation(invitation);
                            return PartialInvitation.FromInvitation(invitation);
                        }
                    }
                    SendInvitation(invitation);
                    return PartialInvitation.FromInvitation(invitation);
                }
            }
            return null; }

1 个答案:

答案 0 :(得分:0)

使用WCF REST时无法生成客户端代码,因此您的客户端可能仍然连接到您的SOAP端点。要生成Rest客户端,请查看以下博客:http://blogs.msdn.com/b/pedram/archive/2008/04/21/how-to-consume-rest-services-with-wcf.aspx