一个HttpClient使用Windows认证请求WCF服务的例子
有个项目需要调用第三方SDK,而SDK获取服务器的已安装的特殊打印机列表返回给调用方。
但我不想依赖这个SDK,因为这个SDK是使用.NET Framework编写的,而我的项目是使用.NET Core编写的,并且想要部署在Docker容器内运行。
于是反编译了SDK,查看源代码,看到该SDK调用了一个URL获取结果。
而这个URL是本地URL,http://localhost开头的,此时我才知道这个SDK所对应的软件在服务器提供了一个本地的Web服务。
于是我在项目里移除这个SDK,直接调用URL。
但获取结果失败了,提示“响应状态代码不指示成功: 401 (Unauthorized)。”。而直接浏览器访问这个URL却成功返回结果。
刚开始一脸懵逼,不知道原来是没有认证的原因在作梗...
很习惯性的就祭出Fiddler监听这个URL,在浏览器里直接访问这个URL,在Fiddler却看到这个URL被请求了3次。
当时没有在意,直接拿到Request Header,塞到HttpClient的Header里,再次请求,还是报错。
重新粗略地看Fiddler,这时才留意到重复请求3次的问题。
我以为是请求内重定向,设置AllowAutoRedirect为true,再次请求,又报错。
又重新仔细地逐条看Fiddler,第二条在Request Header出现了Authorization: Negotiate xxxxxxxxx。
这才知道用了Authorization认证,于是我根据URL端口查到Windows的端口占用列表,顺便找到了该端口占用所对应的PID。
找到PID就找到了进程,从而找到进程所在的文件夹目录,查看它的config配置文件,从配置描述来看,这个Web服务更准确来讲是一个WCF服务。
它使用了security节点:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"></transport>
</security>
我设置UseDefaultCredentials为true,再次请求,成功获取结果。
这是HttpClient请求本地WCF服务 最终代码:
private static async void Test()
{
Random rand = new Random();
var r = rand.Next(, );
string url = "http://localhost:8080/WebPrintService/GetClientPrinters?rand=" + r; var handler = new HttpClientHandler();
//handler.AllowAutoRedirect = true;
//handler.UseDefaultCredentials = true;
//handler.PreAuthenticate = true; HttpClient httpClient = new HttpClient(handler); //HttpRequestMessage requestMessage = new HttpRequestMessage();
//requestMessage.RequestUri = new Uri(url);
//requestMessage.Method = HttpMethod.Get; //requestMessage.Headers.CacheControl.MaxAge = TimeSpan.Zero;
//requestMessage.Headers.Authorization=new AuthenticationHeaderValue(); //requestMessage.Headers.Accept.Clear();
//requestMessage.Headers.Accept.ParseAdd("application/json, text/javascript, */*; q=0.01"); //requestMessage.Headers.AcceptEncoding.Clear();
//requestMessage.Headers.AcceptEncoding.ParseAdd("gzip, deflate"); //requestMessage.Headers.AcceptLanguage.Clear();
//requestMessage.Headers.AcceptLanguage.ParseAdd("zh-CN"); //requestMessage.Headers.UserAgent.Clear();
//requestMessage.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"); //requestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest"); //var responseMessage = await httpClient.SendAsync(requestMessage);
//var result = await responseMessage.Content.ReadAsStringAsync(); var result = await httpClient.GetStringAsync(url);
JsonConvert.DeserializeObject<PrinterInfo>(jsonString); //第二种写法,.NET Framework自带,无须为了HttpClient使用NuGet引入Microsoft.Net.Http包
//WebRequest request = WebRequest.Create(url);
//request.Method = "GET";
//request.UseDefaultCredentials = true;
//WebResponse response = request.GetResponse();
//var stream = response.GetResponseStream();
//using (var streamReader = new StreamReader(stream))
//{
// using (var textReader = new JsonTextReader(streamReader))
// {
// var serializer = new JsonSerializer();
// var result = serializer.Deserialize<List<PrinterInfo>>(textReader);
// }
//}
}
一个HttpClient使用Windows认证请求WCF服务的例子的更多相关文章
- Ajax请求WCF服务以及跨域的问题解决
Ajax请求WCF服务以及跨域的问题解决 这两天准备重构一下项目,准备用纯html+js做前台,然后通过ajax+WCF的方式来传递数据,所以就先研究了一下ajax访问的wcf的问题,还想到还折腾了一 ...
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...
- WCF服务寄宿IIS与Windows服务 - C#/.NET
WCF是Windows平台下程序间通讯的应用程序框架.整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择.wcf程序的运行 ...
- WCF服务寄宿IIS与Windows服务
WCF是Windows平台下程序间通讯的应用程序框架.整合和 .net Remoting,WebService,Socket的机制,是用来开发windows平台上分布式开发的最佳选择.wcf程序的 ...
- 使用Impersonation仿冒用户运行WCF 服务方法
默认情况下,当我们把wcf服务器部署在IIS上时, 我们访问wcf时使用的是IIS内建的内建角色,对于IIS8.0,它被命名为ApplicationPoolIdentity, 一般来说,系统为每个应用 ...
- 使用IIS发布WCF服务
上一篇是Windows服务为宿主的WCF服务,现在用IIS为宿主发布WCF服务. 第一步:肯定是新建一个WCF服务啦[是WCF服务应用程序],然后在解决方案上再次添加一个新项目[我们选择WCF服务库, ...
- WCF初探-8:WCF服务承载 (上)
前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...
- 使用HttpClient消费ASP.NET Web API服务
本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择&quo ...
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7932268 在前面一篇文章中,我们分析了And ...
随机推荐
- Vivado Design Suite用户指南之约束的使用第二部分(约束方法论)
Constraints Methodology(约束方法论) 关于约束方法论 设计约束定义了编译流程必须满足的要求,以使设计在板上起作用. 并非所有步骤都使用所有约束在编译流程中. 例如,物理约束仅在 ...
- Android的Base64的坑
Base64.encodeToString加密后一直和Apache的对不上,多了换行符,最后使用了NO_WRAP就好了 Base64.encodeToString(src, Base64.URL_SA ...
- 深度解剖session运行原理
已经大半年没有更新博客了,一方面有比博客更重要的事情要做,另外一方面也没有时间来整理知识,所以希望在接下来的日子里面能够多多的写博客来与大家交流 什么是session session的官方定义是:Se ...
- kubernetes-deployments
Kubernetes令部署应用.管理应用变得简单直白,令大多数操作简化为单个API或单个命令行,包括发布新的应用程序,升级.那么为什么我们还需要部署呢? 自动化Deployment和滚动更新程序.相比 ...
- 搭建Keil C51开发环境
安装Keil 首先需要获取Keil的安装程序,然后双击开始安装.安装过程非常简单,基本都是一路next.具体步骤如下图: 注册 如果不注册,会有许多功能限制,例如限制生成的代码的大小.为了学习和和教学 ...
- [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串
Given a string, find the length of the longest substring without repeating characters. Example 1: In ...
- axios 使用post方式传递参数,后端接受不到
参考 https://segmentfault.com/a/1190000012635783
- mac 远程连接 云服务器
之前mac 命令行连接云端服务器,一直失败,今天问题突然间解决了,如果遇到类似的问题,按照方法解决不了,可以在下面留言,共同探讨. 首先,在云端先判断一下云端服务器是否安装了 ssh服务器:op ...
- 微信小程序开发笔记02
今天学习了微信小程序开发用到的语言,wxml与wxss语言基本语法与html和css基本语法相似,学习起来相对简单.在小程序主要的语言是js(javascript,跟准确的说是jqery) ,由于这种 ...
- [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
[教程]微信官方开源UI库-WeUI使用方法 [ 教程]微信官方开源UI库-WeUI使用方法 地址:http://www.weui.org.cn/?/article/1 微信公众号开发-WeUI使用说 ...