C# 如何从Windows服务调用WebAPI
我有一个用Windows服务编写的应用程序,这个应用程序需要调用用Asp.Net MVC 4 WebAPI编写的WebAPI。WebAPI中的此方法返回原语类型的DTO,类似于:C# 如何从Windows服务调用WebAPI,c#,.net,asp.net-mvc,windows-services,asp.net-web-api,C#,.net,Asp.net Mvc,Windows Services,Asp.net Web Api,我有一个用Windows服务编写的应用程序,这个应用程序需要调用用Asp.Net MVC 4 WebAPI编写的WebAPI。WebAPI中的此方法返回原语类型的DTO,类似于: class ImportResultDTO { public bool Success { get; set; } public string[] Messages { get; set; } } 在我的webapi中 public ImportResultDTO Get(int clientId) {
class ImportResultDTO {
public bool Success { get; set; }
public string[] Messages { get; set; }
}
在我的webapi中
public ImportResultDTO Get(int clientId) {
// process.. and create the dto result.
return dto;
}
我的问题是,如何从Windows服务调用webApi?我有我的URL和参数值,但我不知道如何调用以及如何将xml结果反序列化到DTO
谢谢您可以使用。在下面的示例中,您显然需要编辑假基址和请求URI,但这也显示了检查响应状态的基本方法
// Create an HttpClient instance
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8888/");
// Usage
HttpResponseMessage response = client.GetAsync("api/importresults/1").Result;
if (response.IsSuccessStatusCode)
{
var dto = response.Content.ReadAsAsync<ImportResultDTO>().Result;
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
//创建一个HttpClient实例
HttpClient=新的HttpClient();
client.BaseAddress=新Uri(“http://localhost:8888/");
//用法
HttpResponseMessage response=client.GetAsync(“api/importresults/1”).Result;
if(响应。IsSuccessStatusCode)
{
var dto=response.Content.ReadAsAsync().Result;
}
其他的
{
Console.WriteLine(“{0}({1})”,(int)response.StatusCode,response.ReasonPhrase);
}
您可以将此NuGet软件包安装到Windows服务项目中
下面是一个简单的代码片段,演示如何使用HttpClient:
var client = new HttpClient();
var response = client.GetAsync(uriOfYourService).Result;
var content = response.Content.ReadAsAsync<ImportResultDTO>().Result;
var-client=new-HttpClient();
var response=client.GetAsync(uriOfYourService.Result);
var content=response.content.ReadAsAsync().Result;
(为了简单起见,我在这里调用.Result())
有关HttpClient的更多示例,请检查以下内容:除了按照人们的建议引用HttpClient外,如果您将ImportResultDTO放置在其自己的类库(您的服务模型库)中,然后从Web API服务和Windows服务引用该库,则会使工作更轻松。然后,您可以让HttpClient将服务调用数据的具体化处理到强类型DTO类中。谢谢blins,在调用
client.GetAsync(…).Result
之前,有没有办法检查我的WebAPI的URL是否可用?我的意思是因为互联网连接或我的webapi可能不稳定,我需要先检查它,然后再为它做一个正确的事件日志。谢谢。你能不能把对GetAysnc的调用包装在一个try/catch块中并处理可能的异常?尝试并跟踪堆栈跟踪,内部异常看起来与您所追求的类似(例如“无法建立连接,因为…”),谢谢Maggie。我投票支持你的awser。在调用client.GetAsync(…).Result之前,有没有办法检查我的WebAPI的URL是否可用?我的意思是因为互联网连接或我的webapi可能不稳定,我需要先检查它,然后再为它做一个正确的事件日志。非常感谢。