2011-08-24 14 views
7

Parametre, bir dize olarak alınan bir yöntemi olan bir REST WCF hizmetim var. Bu dize eğik çizgi/karakter içerebilir. URL yanlış gittiğini düşündüğüm için isteğimi yanlış yapar. istemeyi ve tepkisini alırkenÇizgi ve diğer 'URL'ye duyarlı' karakterleri WCF REST hizmetine nasıl geçirebilirim?

(WebRequest.GetResponse()) "Uzak sunucu hata verir.: (400) Bad Request" atar istisna.

Benim isteği: http://localhost:17679/testmethod/DmC/TCGlOLz1EbEwqAls5Q== \ nh2cQzTizSBg =

Ben Uri.EscapeDataString kullanmaya çalıştı ama yardımcı olmuyor, ben yukarıdaki gibi aynı istisna olsun. Bu dönüşümden sonra isteğim şöyle görünür: http://localhost:17679/testmethod/DmC%2FTCGlOLz1EbEwqAls5Q%3D%3D%0Ah2cQzTizSBg%3D

İstediğim gibi çalıştığını dizede kesme işareti olmadan bir dize iletirseniz.

Nasıl bir WCF REST hizmete eğik çizgi ve diğer 'url duyarlı' karakterleri geçebilir?

Thx.

GÜNCELLEME: Sana cevabım Körükteki görebilirsiniz, bunu çözdü.

+0

Bu neden kabul edilemez? WCF tarafından çözülmez mi? Eğer öyleyse işleviniz ne görüyor? Bir istisna atıldı mı? [Bu belge] 'de açıklandığı gibiExceptionDetailInFault öğesini ayarladınız mı (http://msdn.microsoft.com/en-us/library/ff649234.aspx). –

+0

Yani, "Uzak sunucu bir hata verdi: (400) Hatalı İstek." WebRequest'ın GetResponse yöntemini çağırırken istisna gelir. – Tom

+0

Sorunuz, çıkış metnini iletmenin de 400 hatasını döndürdüğünü açıkça belirtmedi. Lütfen düzenleyin. –

cevap

7

(normalde normal karakter olarak okunacak meta zorlar).

URI şablonu anahtardır. Bu şekilde URI tanımlarsanız

, yukarıdaki istisna oluşturur:

[OperationContract()] 
    [WebGet(UriTemplate = "/testmethod/{testvalue}"/*, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml*/)] 
    string TestMethod(string testvalue); 

bu şekilde değiştirerek, çalışır:

[OperationContract()] 
    [WebGet(UriTemplate = "/testmethod?v={testvalue}"/*, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml*/)] 
    string TestMethod(string testvalue); 

Neyse, Uri.EscapeDataString gereklidir! Kabul cevabı URI parametresi URI sonundadır bazı durumlarda, içinde çalışacak olsa bir URI parametresi bir URI ortasında ise

-2

Her birinden önce bir \ 'yi zorlamayı deneyin. Bunu çözüldü

+0

Çalışmıyor, denediğim ilk şey buydu. Teşekkürler! – Tom

+0

tamam, kolay cevap verdiğim için üzgünüm – Stefano

0

, o işe yaramaz. Ancak, birkaç yapılandırma ayarıyla, uygulamanızın kodlanmış eğik çizgileri kabul etmesine izin verebilirsiniz.

Gelen istekleri alan HttpListener, ham istek URI'sini ayrıştırmak için dahili bir HttpListenerRequestUriBuilder kullanır.

HttpListenerRequestUriBuilder veya bir ayar dayalı kodlama okunabilir hale olmayacaktır olacaktır. senin app.config dosyaya aşağıdaki ayarı ekleyin: Bu gelen Message 'ın To başlıkları doğru URI'lerini atlanmaması, olmadan inşa edilecek sağlayacak

<configuration> 
    <system.net> 
    <settings> 
     <httpListener unescapeRequestUrl="false"/> 
    </settings> 
    </system.net> 
</configuration> 

.

Eğer 4,5 önce .NET bir sürümünü kullanıyorsanız, ben de http ve https yolları için eğik çizgi kaçış değil System.Uri sınıf talimat başka bir ayar eklemek gerekebilir inanıyoruz.

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
     <add name="https" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 

Uri.Match ve varsayılan QueryStringConverter hala çok bir yöntem gibi, çıkış kullanılmayan metinle çalışması gerekir: bar parametreye Çıkışsız dize sağlayacaktır

[WebGet(UriTemplate = "foos/{bar}/baz"] 
public Baz GetFooBaz(string bar) 
{ 
    // ... 
} 

aşağıdaki gibi ayardır.

İlgili konular