Soru UriTemplate eşleşmesini ayırmak için sorgu dizesi parametrelerini kullanma


Bir REST-ful web hizmeti oluşturmak için WCF 4.0 kullanıyorum. Ne yapmak istediğim, sorgu dizesi parametrelerini temel alan farklı servis yöntemlerine sahip olmaktır. UriTemplate.

Örneğin, kullanıcıların sürücü belgesi veya sosyal güvenlik numaralarını anahtar olarak kullanarak bir kişi hakkında bilgi almalarını sağlayan bir API'ye sahibim. Benim .. De ServiceContract / interface İki yöntem tanımlayabilirim:

[OperationContract]
[WebGet(UriTemplate = "people?driversLicense={driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people?ssn={ssn}")]
string GetPersonBySSN(string ssn);

Ancak, her iki yöntemle de hizmetimi aradığımda, aşağıdaki özel durumları elde ederim:

UriTemplateTable, sahip olduğu birden fazla şablonu desteklemiyor   şablon olarak eşdeğer yol 'people? ssn = {ssn}' ancak farklı   Sorgu dizelerinin, sorgu dizelerinin tamamı ile ayrılamıyor olduğu sorgu dizeleri   değişmez değerler. Daha fazla bilgi için UriTemplateTable belgelerine bakın   detay.

Bunu yapmanın bir yolu yok mu UriTemplates? Ortak bir senaryo gibi görünüyor.

Çok teşekkürler!


21
2018-01-04 00:30


Menşei


@ BaTTy.Koda Cevabınız için teşekkürler. Bu yazının tam olarak ne yaptığını bilerek bitirdim ve iyi çalışıyor. Bu yazı 2008'den beri belki de MSDN belgelerine göre bir şeyler geliştirdiğini düşündüm.msdn.microsoft.com/en-us/library/bb675245.aspxdize sorgu belirsizliği hakkında konuşuyor. Ama ne yazık ki ... - msplants


Cevaplar:


Göre Bu gönderimümkün değil, böyle bir şey yapmak zorunda kalacaksınız:

[OperationContract]
[WebGet(UriTemplate = "people/driversLicense/{driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people/ssn/{ssn}")]
string GetPersonBySSN(string ssn);

8
2018-01-05 15:11





Alternatif olarak, sorgu dizesi biçimini tutmak istiyorsanız, UriTemplate’in başına bir statik sorgu dizesi parametresi ekleyerek çalışır. Örneğin:

[OperationContract]
[WebGet(UriTemplate = "people?searchBy=driversLicense&driversLicense={driversLicense}")]
string GetPersonByLicense(string driversLicense);

[OperationContract]
[WebGet(UriTemplate = "people?searchBy=ssn&ssn={ssn}")]
string GetPersonBySSN(string ssn);

11
2017-08-14 20:17





Bu soruna da girdim ve sonunda farklı bir çözüm buldum. Bir nesnenin her özelliği için farklı bir yönteme sahip olmak istemedim.

Yaptığım şey şöyle oldu:

Herhangi bir sorgu dizesi parametresi belirtmeyen hizmet sözleşmesindeki URL Şablonunu tanımlayın:

[WebGet(UriTemplate = "/People?")]
[OperationContract]
List<Person> GetPersonByParams();

Sonra uygulamada herhangi bir geçerli sorgu dizesi parametrelerine erişir:

public List<Person> GetPersonByParms()
    {
        PersonParams options= null;

        if (WebOperationContext.Current != null)
        {
            options= new PersonParams();

            options.ssn= WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["ssn"];
            options.driversLicense = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["driversLicense"];
            options.YearOfBirth = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["YearOfBirth"];
        }

        return _repository.GetPersonByProperties(options);
    }

Daha sonra, URL’leri kullanarak arama yapabilirsiniz.

/PersonService.svc/People

/PersonService.svc/People?ssn=5552

/PersonService.svc/People?ssn=5552&driversLicense=123456

Ayrıca, sorgu dizesi parametrelerini karıştırıp eşleştirmenizi sağlar, böylece yalnızca istediğiniz şeyi kullanın ve ilginizi çekmediğiniz diğer paramları atlayın. Yalnızca bir sorgu parametresiyle sınırlanmamanın avantajına sahiptir.


10
2017-12-06 14:38