2008-09-26 23 views
75

WCF DESTEK çağrısında bir hata giderilirse, istenen kaynak gibi bulunamazsa, OperationContract yöntemimde HTTP yanıt koduyla (örneğin, HTTP 404 gibi bir değere ayarlayarak) nasıl oynayabilirim?Özel bir HTTP durum kodunu WCF REST yönteminden nasıl döndürebilirim?

+0

Tamam tüm cevapları servis uygulaması haline getirdiler. Ya tamamen geçersiz uri geçirirlerse? Hizmetinizdeki tüm beklenmedik isabetler için 404'ü nasıl sağladığınızı düşünüyorsunuz? –

cevap

96

erişebileceğiniz bir WebOperationContext vardır ve ayarlanabilir bir StatusCode özelliğine sahiptir tip OutgoingWebResponseContext bir OutgoingResponse özelliğine sahiptir.

WebOperationContext ctx = WebOperationContext.Current; 
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; 
+3

Bu, WCF Data Services - Servis İşlemleri içinde çalışır mı? Şansım olmadı, belirlediğim StatusCode başka bir şey tarafından kondu. Yani tüm HTTP POST isteklerinde, 201'e ayarladığımdan vb. – RyBolt

+1

Benim durumumda çalışmıyor, durumun üzerine yazılıyor. Ancak, bir 'WebFaultException' atmak işe yarıyor gibi görünüyor. –

23

404 için 404 için durum kodu ve bir çağrı ile bir durum açıklamasına ayarlayacaktır SetStatusAsNotFound (string mesaj) denilen WebOperationContext.Current.OutgoingResponse üzerine yöntemle inşa yoktur.

Ayrıca, SetStatusAsCreated (Uri konumu), durum kodunu 201 ve konum üstbilgisini tek bir aramayla ayarlayacağınızı unutmayın.

+0

Bu tercih edilen cevapta görüntülenen yönteme göre tercih edilir mi? – crush

58

bir sebebi vücudu dönmek gerekirse o zaman başlığında durum açıklamasına görmek istiyorsanız Örneğin WebFaultException

bir göz

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest); 
+2

Statik WebOperationContext.Current –

+0

'u kullanmayacağımızdan beri bunu kabul ettiğimden daha çok beğeniyorum. Bu durumun yalnızca şu andan itibaren geçerli olduğunu unutmayın: http://msdn.microsoft.com/en-us/library/dd989924.aspx – sebagomez

+0

hmm, .NET 4.5.1'de bu durum benim için durum kodunu ayarlamıyor, hala 200 tane alıyorum. jsonp kullanıyorum, callback'i (javascript'te) çağırıyor ve mesajımı ve durum kodumu iletiyor tamsayı. – Shavais

2

, DİNLENME yöntemi dönmek emin olmalısınız var Aşağıdaki gibi Catch() bölümünden null: WCF Veri Hizmetleri için benim için çalışmadı bu aşağıdaki gibi:

catch (ArgumentException ex) 
{ 
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError; 
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message; 
    return null; 
} 
+1

Bu benim için de işe yaramadı, hala bir 200 elde ediyorum. WebHttpBinding kullanarak crossDomainScriptAccessEnabled = "true" ve varsayılan gövde stili sarılmış ve varsayılan bir çıkış biçimi json ile webHttp bir son nokta davranışı kullanıyorum. ama bu önemli değil, değil mi? – Shavais

İlgili konular