簡體   English   中英

ASP.NET Web API ReadAsAsync失敗,沒有錯誤

[英]ASP.NET Web API ReadAsAsync fails with no error

我第一次涉足ASP.NET Web API,但遇到了一個問題,這使我感到非常沮喪。

我正在調用的RESTful服務返回的數據如下:

<SearchResults  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Results>
        <Result>
            <Title>foo</Title>
        </Result>
        <Result>
            <Title>bar</Title>
        </Result>
    </Results>
    <NumberOfResults>2</NumberOfResults>
</SearchResults>

因此,我創建了一些實體來表示此數據:

[Serializable, DataContract(Namespace = "")]
public class SearchResults
{
    public List<Result> Results { get; set; }
    public int NumberOfResults { get; set; }
}

[Serializable, DataContract(Namespace = "")]
public class Result
{
    public string Title { get; set; }
}

然后,我嘗試反序列化數據:

var client = new HttpClient();
client.BaseAddress = new Uri("some uri");

var response = client.GetAsync("/some/path/").Result;
response.EnsureSuccessStatusCode();

var result = response.Content.ReadAsAsync<SearchResults>().Result;

即使我知道有返回的結果,並且如果我檢查response.Content.ReadAsStringAsync(),XML也會包含預期的結果,結果是結果為null且NumberOfResults = 0的SearchResults對象。

我改為嘗試:

var serializer = new XmlSerializer(typeof(SearchResults));
var results = (SearchResults)serializer.Deserialize(response.Content.ReadAsStreamAsync().Result);

然后返回一個完全填充的SearchResults對象。

最后,我嘗試實現一個簡單的IFormatterLogger並將其傳遞給ReadAsAsync,如果我嘗試兩次讀取流(如預期的那樣),則會調用該方法,但在使用ReadAsAsync進行反序列化的標准嘗試期間不會被調用。

我可以使用XmlSerializer並向其傳遞蒸汽,因為它可以正常工作,但這似乎不像使用ReadAsAsync那樣整潔,再加上我真的很想知道我在做錯什么:)

更新的16:38BST 03/09/2012

好的,在使用Web API時,我顯然缺少了一些至關重要的東西,但是我仍然不知道是什么!

現在,我嘗試使用帶有PUT動詞的服務,並且當我使用XmlSerializer測試實體時,我的實體可以正確地序列化時,該請求使用HTTP 500失敗。我檢查了Fiddler發送的內容以及Web API生成的XML外觀沒有像XmlSerializer生成的那樣。 首先,所有內容都具有“ _x003C_Name_x003E_k__BackingField”之類的名稱,而不是簡單的“ Name”。

我的更新中出現了怪異的“ k__BackingField”名稱,導致我找到了解決方法,並且像往常一樣,這非常簡單。

我忘了用DataMemberAttribute標記實體中的屬性。

標記它們,一切按我最初的預期開始工作!

僅此而已!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM