2014-03-20 3 views
2

Я видел похожие вопросы, но никто, кажется, не помогает мне в моей проблеме, поэтому, пожалуйста, несите меня.HttpResponseMessage от HttpClient к пользовательскому объекту C#

У меня есть метод контроллера WebAPI, который определен как таковой:

[HttpPost] 
[Route("")] 
public HttpResponseMessage CreateMyObject(MyObjectRequest myObject) 
{ 
    MyObject o; 
    try 
    { 
     o = _serviceFactory.GetInstance().CreateMyObject(myObject); 
    } 
    catch (Exception ex) 
    { 
     ex.WriteToLog(); 
     throw ApiHelper.CreateResponseException(HttpStatusCode.InternalServerError, ex); 
    } 
    var response = Request.CreateResponse(HttpStatusCode.Created, o); 
    var uri = Url.Link("GetMyObjectById", new { myObjectId = o.MyObjectId.ToString() }); 
    response.Headers.Location = new Uri(uri); 
    return response; 
} 

Say, MyObject содержит два свойства,

public MyObject 
{ 
    public Guid MyObjectId; 
    public string MyObjectName 
} 

клиент был написан, чтобы вызывать эти методы контроллера в приложении WPF , Вот метод клиент, который используется:

public HttpResponseMessage CreateQuote(MyObjectRequest myObject) 
{ 
    var hashtable = new Hashtable 
       { 
        {"myObject", myObject} 
       }; 

    var task = GetResponse("", hashtable); 
    var response = task.Result; 

    return response; 
} 

protected async Task<HttpResponseMessage> GetResponse(string path, Hashtable parameters) 
{ 
    var response = await GetAsync(BuildRequestUri(path, parameters)).ConfigureAwait(false); 
    return response.IsSuccessStatusCode ? response : new HttpResponseMessage(); 
} 

protected async Task<HttpResponseMessage> GetResponse(string path) 
{ 
    return await GetResponse(path, null); 
} 

Контроллер и поддерживает клиентский код не был написан мной и был уже в системе. Я просто поглощаю это в приложении WPF. Теперь я пытаюсь вызвать метод контроллера через клиента в приложении и получить ответ от MyObject, чтобы я мог получить доступ к MyObjectId, который был создан и установлен. Я пробовал некоторые другие ответы на подобные вопросы, но даже не видел некоторых методов, которые вызываются в ответ, чтобы получить информацию. Вот первая часть вызова к клиенту, что я имею в применении:

var httpResponse = ApplicationService.CreateMyObject(myObjectRequest); 

Служба приложения просто вводит клиент в конструктор и позволяет мне вызвать метод CreateMyObject. Есть ли какое-либо представление о том, как я должен получить объект MyObject из ответа?

ответ

1

Я все еще немного знаком с web api, но сейчас я работаю с ним над проектом. Дайте следующий код попробовать:

MyObject myObject; 
if (response.IsSuccessStatusCode) 
{ 
    // Parse the response body. Blocking! 
    myObject = response.Content.ReadAsAsync<MyObject>().Result; 
} 

Таким образом, вы теоретически могли бы изменить свой метод, как это (может быть не совсем то, что вы хотите):

public MyObject CreateQuote(MyObjectRequest myObject) 
{ 
    var hashtable = new Hashtable 
       { 
        {"myObject", myObject} 
       }; 

    var task = GetResponse("", hashtable); 
    var response = task.Result; 

    MyObject newObject; 
    if (response.IsSuccessStatusCode) 
    { 
     // Parse the response body. Blocking! 
     newObject= response.Content.ReadAsAsync<MyObject>().Result; 
    } 

    return newObject; // instead of response 
} 
+0

Это, кажется, работает, когда я делаю GET. Тем не менее, я делаю POST здесь, так что это действительно не помогает. Есть ли другой способ сделать это для POST? –

+0

Хммм ... мой код тоже POST. Вы ссылаетесь на System.Net.Http.Formatting.dll в своем проекте? http://stackoverflow.com/questions/18495484/httpclient-and-readasasynct-extension-method –

+0

Вы были абсолютно правы. Я делал это очень неправильно. Благодарю за ваш ответ. –

Смежные вопросы