0

RESTful アーキテクチャを既存の SOAP サービスに追加しようとしているので、Rest と SOAP に準拠したサービスの両方を利用できます。WebGets と WebInvokes を使用して、サービス インターフェイスの既存のメソッドにアクセスしています。メソッド シグネチャからわかるように、Object はパラメーターとして渡され、Object はメソッドから返されます。そのため、http://www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSONに従って、メッセージ形式として Json を使用しています。Chrome アドオン Advanced Rest Client には、POST クエリ中に 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; }
4

1 に答える 1

0

WCF REST を使用している場合はクライアント コードを生成できないため、クライアントはおそらく SOAP エンドポイントにまだ接続されています。Restクライアントを生成するには、次のブログをチェックしてください。

于 2013-01-28T13:50:48.940 に答える