博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows服务与控制台应用程序之HttpWebResponse的使用
阅读量:5130 次
发布时间:2019-06-13

本文共 2288 字,大约阅读时间需要 7 分钟。

  HttpWebRequest+HttpWebResponse经常会被使用在控制台应用程序中,比如检测页面是否正常或定期访问。随着需求的变化,我们可能需要将此功能迁移到windows服务中执行,windows服务不会被轻易的误关闭。

  一、在控制台应用程序中使用HttpWebResponse:

 

HttpWebRequest request = WebRequest.Create(urlPath) as HttpWebRequest;

//如下三行效果一样,若全被注释了,那么将会看到401的异常信息。

request.UseDefaultCredentials = true;              
//request.Credentials = CredentialCache.DefaultNetworkCredentials;
//request.Credentials = CredentialCache.DefaultCredentials;

// Get the response.

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode == HttpStatusCode.OK)
    {
        // Display the status.
        WriteLog(response.StatusDescription);
        // Get the stream containing content returned by the server.
        using (Stream dataStream = response.GetResponseStream())
        {
            // Open the stream using a StreamReader for easy access.
            using (StreamReader reader = new StreamReader(dataStream))
            {
                //Read the content.
                string responseFromServer = reader.ReadToEnd();
                //Display the content.
                Console.WriteLine(responseFromServer);
                Console.WriteLine(DateTime.Now.ToString() + " Successed.");
                WriteLog("Successed");
            }
        }
    }
    else
    {
        WriteLog("status code is not Ok it was" + response.StatusCode.ToString());
    }
}

  结论:以上代码可以正常运行,因为控制台应用程序是基于当前登录的用户身份去访问。
二、windows服务中使用HttpWebResponse
  我们直接将以上代码迁移到windows服务中,理论上可以正常运行的。可实际情况出现了如下错误:
 
 

System.Net.WebException: 远程服务器返回错误: (401) 未经授权。

   在 System.Net.HttpWebRequest.GetResponse()

  那么,我们如何解决呢?我们使用的是本地IIS的站点。先引用一个网友的一段话:
 
 

Windows Service application run under the LocalSystem account by default, whereas your console app runs under your user account, you may therefore be meeting permission problems (windows firewall?)

You should run the service under the administrator account to see if this resolves your issue.

  试想一下,我们不难理解,windows服务程序是基于本地系统帐户运行的。 
  其实关键部分还是设置UseDefaultCredentials或者Credentials,代码中的三种方法是有效的。这三种方法的差别:
 
 

1. Credentials = CredentialCache.DefaultCredentials; 表示在发送请求会带上当前用户的身份验证凭据。

2. UseDefaultCredentials = true; 此方法在内部会调用前面的方法,因此与前面的方法是一样的。
3. Credentials = CredentialCache.DefaultNetworkCredentials; 是在.NET 2.0中引用的新方法。

  解决方法一,修改凭证格式,指定用户名和密码:
 
 

request.UseDefaultCredentials = true;

修改为:

NetworkCredential credentials = new NetworkCredential("username", "pwd");

request.Credentials = credentials;

 

转载于:https://www.cnblogs.com/greatwang/archive/2012/10/16/3292548.html

你可能感兴趣的文章
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>