![](/img/trans.png)
[英]Use cookie authentication in mvc5 project with web api controller
[英]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.