Bir WCF REST yönteminden özel bir HTTP durum kodunu nasıl döndürebilirim?


88

Bir WCF REST çağrısında istenen kaynağın bulunmaması gibi bir şeyler ters giderse, OperationContract yöntemimde HTTP yanıt koduyla (örneğin HTTP 404 gibi bir şeye ayarlayarak) nasıl oynayabilirim?


tamam buna verilen tüm yanıtlar, kontrolün hizmet uygulamanıza girdiğini varsayalım. ya tamamen geçersiz bir uri geçirirlerse? hizmetinize tüm beklenmedik isabetler için nasıl bir 404 sağlamayı düşünüyorsunuz?
Nathan Tregillus

Yanıtlar:


112

Erişebileceğiniz bir WebOperationContextvar ve ayarlanabilen bir OutgoingResponseözelliği olan tipte OutgoingWebResponseContextbir StatusCodeözelliği var.

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

5
Bu, WCF Veri Hizmetleri - Hizmet İşlemleri içinde çalışır mı? Şansım olmadı, belirlediğim Durum Kodu başka bir şey tarafından baskılanıyor gibi görünüyor. Yani tüm HTTP POST isteklerinde, onu 201, vb. Olarak ayarlasam da 204 geri alıyorum.
RyBolt

1
Benim durumumda çalışmıyor, durumun üzerine yazılıyor. WebFaultExceptionAncak a atmak işe yarıyor gibi görünüyor.
Josh M.

74

Bir neden gövdesi döndürmeniz gerekiyorsa, WebFaultException'a bir göz atın .

Örneğin

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

4
Statik WebOperationContext'i kullanmadığımız için bunu kabul edilenden daha çok seviyorum.Current
Noel Abrahams

bunun yalnızca
famework

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

4
Bu, 2XX kodları dışındaki her şey için harika görünüyor, ancak bir WebFaultExceptiondöndürmek için a atar mıydınız HttpStatusCode.Created?
ezmek

23

404 için, WebOperationContext.Current.OutgoingResponse üzerinde , durum kodunu 404'e ayarlayacak olan SetStatusAsNotFound (string message) adında yerleşik bir yöntem ve bir çağrı ile bir durum açıklaması vardır.

Ayrıca, durum kodunu 201'e ve konum başlığını bir çağrı ile ayarlayacak SetStatusAsCreated (Uri konumu) olduğunu unutmayın.


Bu, kabul edilen yanıtta gösterilen yönteme göre mi tercih edilir?
ezmek

2

Başlıkta durum açıklamasını görmek isterseniz, REST yöntemi aşağıdaki gibi Catch () bölümünden null döndürdüğünüzden emin olmalıdır:

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 alıyorum. CrossDomainScriptAccessEnabled = "true" ile WebHttpBinding kullanıyorum ve webHttp'nin varsayılan gövde stili ve varsayılan giden yanıt biçimi json ile bir bitiş noktası davranışı kullanıyorum .. ama bu önemli olmamalı, değil mi?
Shavais

2

Ayrıca bir statuscode ve neden gövdesini dönebilirsiniz WebOperationContext 'ın statusCode ve DurumuAçıklama :

WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.