2014-10-23 2 views
3

Довольно новый с ASP.Net WEB API. Имея некоторые проблемы с надлежащей конфигурацией API (и возвращаемым типом) для моего вызова API, который вызывает другую службу ASHX.ASP.Net Web API Возвращаемые значения массива

Я следующие коды (протестировано в HomeController просто чтобы убедиться, что вызов службы будет работать):

public async Task<ActionResult> Index() 
{ 
    WebRequest request = WebRequest.CreateHttp("http://callme/address.ashx"); 

    var response = await request.GetResponseAsync(); 
    string content; 

    using (var stream = response.GetResponseStream()) 
    using(var reader = new StreamReader(stream)) 
    { 
     content = await reader.ReadToEndAsync(); 
    } 

    var result = JsonConvert.DeserializeObject<MyResult[]>(content); 

    return this.View();    
} 

public class MyResult 
{ 
    public string ClientAddress { get; set; } 
} 

Теперь, пытаясь портировать его через к ASP.Net Web API вызова:

ClientAddressController.cs

public class ClientAddressController: ApiController 
{ 
    public async IQueryable<MyResult> GetClientAddress() 
    { 
    WebRequest request = WebRequest.CreateHttp("http://callme/address.ashx"); 

    var response = await request.GetResponseAsync(); 
    string content; 

    using (var stream = response.GetResponseStream()) 
    using(var reader = new StreamReader(stream)) 
    { 
     content = await reader.ReadToEndAsync(); 
    } 

    var result = JsonConvert.DeserializeObject<MyResult[]>(content); 

    // How to return the result object?? 
    } 
} 

public class MyResult 
{ 
    public string ClientAddress { get; set; } 
} 

мне нужна помощь, чтобы правильно определить правильные параметры для вызова Web API, так что я мог бы вернуть объект результата.

Объект результат будет просто массив строк:

[{"Address": "Address 100"}, {"Address": "Address 200"}, {"Address": "300"}] 

Надеясь получить некоторые идеи по разрешению этого. У меня есть идея относительно возврата запросов к базе данных в веб-API, но вызов службы (и метод async) отбросил меня от паза.

Спасибо.

** UPDATE *****

был в состоянии найти какое-то решение по этому вопросу, и я отправляю решение, которое я имею.

public class ClientAddressController: ApiController 
{ 
    public async Task<IHttpActionResult> GetClientAddress() 
    { 
    WebRequest request = WebRequest.CreateHttp("http://callme/address.ashx"); 

    var response = await request.GetResponseAsync(); 
    string content; 

    using (var stream = response.GetResponseStream()) 
    using(var reader = new StreamReader(stream)) 
    { 
     content = await reader.ReadToEndAsync(); 
    } 

    var result = JsonConvert.DeserializeObject<MyResult[]>(content); 
    return Ok(result); 

    // How to return the result object?? 
    } 
} 

public class MyResult 
{ 
    public string ClientAddress { get; set; } 
} 

P.S .: Я собираюсь принять ответ Стриплинга, поскольку он предоставил мне какое-то направление.

ответ

2

Вам нужно создать класс с Address собственности, и сопоставить результаты с объектами этого класса:

public async IQueryable<ClientAddressResult> GetClientAddress() 
{ 
    WebRequest request = WebRequest.CreateHttp("http://callme/address.ashx"); 

    var response = await request.GetResponseAsync(); 
    string content; 

    using (var stream = response.GetResponseStream()) 
    using(var reader = new StreamReader(stream)) 
    { 
     content = await reader.ReadToEndAsync(); 
    } 

    IEnumerable<MyResult> result = JsonConvert.DeserializeObject<MyResult[]>(content); 

    return result.Select(r => new ClientAddressResult{Address = r.ClientAddress}) 
     .AsQueryable(); 
} 

DTO Классы:

public class MyResult 
{ 
    public string ClientAddress { get; set; } 
} 

public class ClientAddressResult 
{ 
    public string Address { get; set; } 
} 
0

Вы можете вернуть массив значений в динамический список, чтобы иметь возможность сделать этот метод возврата метода с помощью динамического списка.

var resultList = new List<dynamic>(); 

resultList.Add(new {Address="Address 100"}); 
resultList.Add(new {Address="Address 200"}); 
resultList.Add(new {Address="Address 300"}); 

return resultList; 

Надеюсь, это то, к чему вы стремились.

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