8

Şu anda WCF RESTful hizmetimi .NET 3.5 (Başlangıç ​​Seti) .NET 4'e taşıyorum. Projemi Visual WCF Rest hizmeti şablonunu kullanarak başlattım Studio 2010. ServiceAuthorizationManager'ı kullanarak yetkilendirme planımı nasıl tutacağımı (RequestInterceptor ile yapılmış) anlamam gerekiyordu. Bazı çalışmalardan ve araştırmalardan sonra yaptım. Ama şimdi bir teminat problemim var. Hizmetim, HTTP durum kodunu ve kısa bir açıklamayı kullanarak istemcimi herhangi bir işlem hatasıyla geri bildirim olarak kullandı. Böyle, neyin yanlış gittiğini müşterilerine açıklamak için benim hizmet yönteminin birçok noktada WebOperationContext kullanıyordu: WCF 4 REST hizmeti bir StatusDescription döndüremiyor, yalnızca StatusCode

protected void returnCode(HttpStatusCode code, string description) 
{ 
    WebOperationContext ctx = WebOperationContext.Current; 
    ctx.OutgoingResponse.StatusDescription = description; 
    ctx.OutgoingResponse.StatusCode = code; 
} 

Ama WCF 4

, çalışan tek StatusCode - DurumuAçıklama sessizce başarısız olur. Nedenini anlayamıyorum. Tek tahminim, WebOperationContext'in bu yeni WCF 4 senaryosunda çalışmadığı ve bunun yerine OperationContext kullanmalıyım, ancak bu da işe yaramıyor.

private void GenerateBadDigestMessage(ref OperationContext operationContext) 
{ 
    Message reply = Message.CreateMessage(MessageVersion.None, null, null, new DataContractJsonSerializer(typeof(object))); 

    HttpResponseMessageProperty hrp = new HttpResponseMessageProperty(); 
    hrp.StatusCode = HttpStatusCode.Forbidden; 
    hrp.StatusDescription = "bad digest"; 
    reply.Properties[HttpResponseMessageProperty.Name] = hrp; 

    operationContext.RequestContext.Reply(reply); 
    operationContext.RequestContext = null; 
} 

bile direclty burada (WebOperationContext ait Insted) OperationContext kullanarak, DurumuAçıklama yapmaz: Aşağıdaki yöntem benim özel sınıf auth özeti hatalı oluşturulmuş çünkü bir istek erişim olamazdı müşterilerine bildiren, ServiceAuthorizationManager uzanan kullanılır iş.

Neler eksik? Neden küçük bir şey .NET 3.5'ten 4'e kadar kırılabilir?

+0

Kendinden barındırılan veya IIS? Hangi sunucu sürümü? Bunu kendi kendine barındırılan Server 2008R2 ile 4.0'da test ettim ve iyi çalışıyor (Durum Açıklaması ayarlandı). – nitzmahone

+0

Hiç bir çözüm buldunuz mu? Ben de aynı problemle karşı karşıyayım. – Hemant

cevap

4

.NET 4.0'da WebFaultException kullanmanızı öneririm. Örneğin, "Introducing WCF WebHttp Services in .NET 4"'u okuyun. Deneyin

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden); 
+0

Üzgünüm ama .NET 4.0 kullanmak bir seçenek değil. .NET 3.5 ile herhangi bir şans? – Hemant

+0

@Hemant: Yanlış anladığım için özür dilerim, ancak sorunuzu şu kelimeyle başlatıyorsunuz: Hizmetinizi .NET 3.5 (Başlangıç ​​Seti) 'den .NET 4'e taşıyorsunuz ve bazı sorunlarınız var.Yani anlıyorum, .NET 3.5'te zaten çalışan bir çözüm var ve .NET 4.0'da çalışmasını istiyorsanız. Bende aynı problem vardı. .NET 3.5'de hataları bildirmek için 'WebProtocolException 'kullandım. .NET 4.0'a geçişten sonra ** kullanımdan kaldırılmış ** WCF REST Başlangıç ​​Seti'ne karar vermemeye karar verdim. .NET 4.0, WCF REST geliştirme için gerekli tüm özelliklere sahiptir. WebProtocolException yerine WebFaultException işlevini kullanıyorum. – Oleg

+0

Cevabınız için teşekkürler. Aslında bu soruyu sormadım. Sadece aynı problemle uğraşıyordum ve yukarıda sorulan soruların cevapları olmadığını, üzerine bir ödül verdiğimi görüyordum. – Hemant

1

potansiyel bir sorun null RequestContext ayarı olmasıdır:

operationContext.RequestContext.Reply(reply);  
operationContext.RequestContext = null; 

başka olasılık parametresi "description" ayarlanmamış olmasıdır. ,

WebOperationContext.Current.IncomingResponse.StatusDescription 

Başka bir fikir de dönüş kodu denirdi sonra değerleri üzerine yazılmış olabilirdi: istemci tarafında da

Denetlediğiniz?

2

Tamam! İşte anladım. Kodumda yanlış bir şey yok. .NET framework 3.5 veya 4.0 ile yanlış bir şey yok.

Sorun, asp.net geliştirme sunucusudur. Hizmet uygulamanızı hata ayıkladığınızda, asp.net geliştirme sunucusunda barındırılıyor ve uygulama tarafından verilen durum açıklamasını tamamen yok sayar. Refer this question.

En azından bana yardım etmeyi denedim.

+0

Bu, aynı zamanda Web API'sinde çalışmadığının da nedeni. Cevabınızı buldum ve kodumu IIS altında çalıştırdığım anda, ReasonPhrase durum açıklamasını değiştirdi. –

1

Hizmet Yöntemi NULL nesnesinden döndüğünüzden emin olun ... böylece Durum Kodları açıklamasında Yanıt Üstbilgileri görünür, benim için çalıştı.