簡體   English   中英

在MVC控制器中使用Web Api

[英]Use Web Api in a MVC Controller

我必須創建一個將使用我的Web服務的Web服務和應用程序。

我創建了Web Api項目,並且有此方法:

namespace StudentListApi.Controllers
{
    //[Authorize]
    public class ValuesController : ApiController
    {
        StudentContext db = new StudentContext();
        // GET api/values
        public IEnumerable<Student> GetStudents()
        {
            return db.Students;
        }
        //...
    }
}

我需要在控制器中使用此方法。 我的MVC網站收集學生的數據。 並考慮以下數據:

public class HomeController : Controller
{
    private const string APP_PATH = "http://localhost:2640";

    private Models.StudentListEntities db = new Models.StudentListEntities();

    public ActionResult Index()
    {

        //var students = db.Students.OrderByDescending(x => x.Id);
        using (var client = new HttpClient())
        {
            var students = client.GetAsync(APP_PATH + "/api/value").Result;
            //return students.StatusCode.ToString();
            return View(students);
        }

    }
}

但是是行不通的,我有一個錯誤:

錯誤是俄語的,但我認為您可以從異常名稱中了解,並且該項目模型的類型必須為StudentList.Model.Student但我具有HttpResponseMessage。

如何從Web服務中獲取數據,將其轉換為"StudentList.Model.Student"類型,並將其提供給View()

由於您正在進行網絡服務呼叫,因此您需要反序列化來自呼叫的響應。
反序列化的類型將基於您在Api中配置的響應。

它需要在Result.Content.ReadAsStringAsync()值上完成。

您提到的網址為字符串。 我認為您需要使用基於URI的地址。

另外,與GetAsync一起,您需要使用async和await關鍵字。

請嘗試以下示例-

public class DataSourceController : Controller
{
    HttpClient _client;
    string webapiurl = "http://localhost:56472/api/DataSource";

    public DataSourceController()
    {
        _client = new HttpClient();
        _client.BaseAddress = new Uri(webapiurl);
        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    }


    //
    // GET: /DataSource/
    public async Task<ActionResult> Index()
    {
        var ResponseMessage = await _client.GetAsync(webapiurl);

        if(ResponseMessage.IsSuccessStatusCode)
        {

            var data = ResponseMessage.Content.ReadAsStringAsync().Result;

            var datasource = JsonConvert.DeserializeObject<List<DataSourceInfo>>(data);
            return View(datasource);

        }

        return View("Error");

    }
}

看看是否有幫助。

using (var client = new HttpClient())
{
     var students = client.GetAsync(APP_PATH + "/api/value").Result;
     //return students.StatusCode.ToString();
     return View(students);
}

這樣的路徑(APP_PATH +“ / api / value”),但控制器名稱為“ Values Controller”,將ValuesController編輯為ValueController或更改路徑(APP_PATH +“ / api / values”)

然后,比在HomeController中檢查您的請求代碼,檢查您的api(“ http://localhost:2640/api/values ”)是否工作正常。

我在控制台應用程序中使用它,並使用Newtonsoft nuget包

安裝包Newtonsoft.Json

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("yourRootUrl");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    // New code:
    HttpResponseMessage response = await client.GetAsync("api/values");
    if (response.IsSuccessStatusCode)
    {

        var res = Task.Factory.StartNew(() => {
            var data = response.Content.ReadAsStringAsync();
            data.Wait();
            return  JsonConvert.DeserializeObject<List<Student>>(data.Result);
        });
        res.Wait();
        foreach (var s in res.Result)
        {
            Console.WriteLine(s.Name);
        }

    }
 }

暫無
暫無

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

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