2015-09-15 34 views
10

我有一個WCF Restful服務,並且我希望這些方法返回HttpResponseMessage,因爲它似乎是結構化的,而不僅僅是返回數據或異常或其他任何可能會出現的方式。WCF Restful返回HttpResponseMessage想要在設置內容時進行協商

我假設這是一個正確的,如果不讓我知道,但我的問題是當我嘗試設置HttpResponseMessage.Content時會發生什麼。當我這樣做時,我在其中創建了RESTful呼叫請求認證的客戶端。

這裏是我的代碼:

在接口:

[WebGet(UriTemplate = "/GetDetailsForName?name={name}" 
        , ResponseFormat = WebMessageFormat.Json)] 
HttpResponseMessage GetDetailsForName(string name); 

在類:

public HttpResponseMessage GetDetailsForName(string name) 
{ 
    HttpResponseMessage hrm = new HttpResponseMessage(HttpStatusCode.OK) 
     { 
     //If I leave this line out, I get the response, albeit empty 
     Content = new StringContent("Hi") 
     }; 

    return hrm; 
} 

我想嘗試使用Request.CreateResponse,但我似乎無法得到從我的WCF Restful方法請求。 OperationContext.Current.RequestContext沒有CreateResponse。

任何指針?

+0

當你在內容中輸入「Hi」時,客戶端會發生什麼? –

+0

它拋出瀏覽器憑證窗口,即使我放入證書,我只是未經授權。 – Matt

+0

您是否檢查過有和沒有「Hi」的響應的媒體類型?沒有它的應用程序/ json的 –

回答

1

可惜,這是行不通的。演示代碼如下:

構造一個HttpResponseMessage對象,使用JSON序列化程序對其進行序列化並將結果通過網絡傳遞。

問題是HttpResponseMessage是一次性的,不能被序列化,而StringContent根本不能被序列化。

至於爲什麼會被重定向到一個認證形式 - 服務拋出異常時,它不能序列StringContent ,並返回其被理解爲一種身份驗證問題400 HTTP狀態代碼。

+0

您是否有'HttpResponseMessage是一次性的,並且不是被序列化的'文檔/參考。爲什麼'StringContent'不能被序列化? – ANewGuyInTown

+0

這個答案解釋了有關具體情況的內部運作。在其他情況下,您可能能夠以任何方式將幾乎所有內容序列化。如果你需要這個,只需要針對你的具體問題提出一個新問題。 –

+0

不,我試圖理解你在你的回答中引用了什麼,並詢問你說的是什麼。如果你願意,任何東西都可以被序列化,但是,框架提供的或者默認的序列化方式可能會根據你正在使用什麼格式化程序以及什麼屬性存在於_class/properties_中來拒絕_serialize_ 。 – ANewGuyInTown

0

如果我打電話,例如公共字符串getDetails(INT ID),並拋出一個錯誤,這個工程......

catch(Exception ex) 
{ 
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse; 
response.StatusCode = System.Net.HttpStatusCode.OK; //this returns whatever Status Code you want to set here 
response.StatusDescription = ex.Message.ToString(); //this can be accessed in the client 
return "returnValue:-998,message:\"Database error retrieving customer details\""; //this is returned in the body and can be read from the stream 
}