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; }