Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从Windows服务调用WebAPI_C#_.net_Asp.net Mvc_Windows Services_Asp.net Web Api - Fatal编程技术网

C# 如何从Windows服务调用WebAPI

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) {

我有一个用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) {
   // 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可能不稳定,我需要先检查它,然后再为它做一个正确的事件日志。非常感谢。