相关疑难解决方法(0)

为什么我的REST服务.NET客户端会发送没有身份验证标头的每个请求,然后使用身份验证标头重试它?

我们碰巧运行带有API的REST Web服务,要求客户端使用基本身份验证.我们用各种语言制作了一套简洁的样本,展示了如何与我们的服务进行交互.现在我正在检查服务的IIS日志,并发现以下模式经常发生:

  • 请求到来,被HTTP代码401拒绝
  • 相同的请求被重新发送并成功

看起来像第一个请求没有授权标头发送,然后第二个请求与正确的标头一起发送并成功.大多数情况下,日志记录包含"user-agent",这与我们在.NET示例中植入的字符串相同.

所以我认为问题仅在于.NET程序.我们的示例代码没有重现该问题,因此我假设用户以某种方式修改了代码或从头开始编写自己的代码.

我们尝试联系用户,但显然他们不想花时间研究.所以很高兴找到导致.NET程序这种行为的最可能的情况.

他们为什么要这样做?他们为什么不在第一次尝试时附上标题?

.net c# authentication http basic-authentication

17
推荐指数
1
解决办法
9553
查看次数

AuthenticationHeaderValue 与 NetworkCredential

我正在尝试使用 HttpClient 为 HTTP Post 或 HTTP Get 编写客户端。当谷歌搜索时,我遇到了这些在 HttpClient 对象中设置这些身份验证的方法。一个使用 NetworkCredential,另一个使用 AuthenticationHeaderValue

HttpClient sClient;
HttpClientHandler sHandler = new HttpClientHandler();
sHandler.Credentials = new NetworkCredential("UserName", "Password");
sClient = new HttpClient(sHandler);
Run Code Online (Sandbox Code Playgroud)

或者

HttpClient sClient new HttpClient();
sClient.DefaultRequestHeaders.Authorization = 
  new AuthenticationHeaderValue("Basic",Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("UserName:Password")));
Run Code Online (Sandbox Code Playgroud)

在 MSDN 上阅读并没有给我关于它们之间差异的明确答案。在这种情况下,除了身份验证信息的存储方式之外,两者都会执行相同的操作吗?例如 AuthenticationHeaderValue 将其放入标头,而另一个则没有?就我的用例或最佳实践而言,其中一个比另一个更好吗?

.net c#

5
推荐指数
1
解决办法
1918
查看次数

在 SP2013 中使用 REST 和 HTTPClient 创建文件夹

我正在尝试使用 HTTPClient 和 REST 在 SP2013 中创建一个文件夹。

以下是对应用程序的要求和限制

  1. 我需要使用 REST 在 2013 文档库中创建一个文件夹。不允许 CSOM。

  2. 该程序必须是 C# 控制台应用程序。

  3. 我必须仅使用 HTTPClient 来调用 Web 服务。不应使用其他旧类或库。

  4. 集成身份验证是必须的。您不得在代码中输入您的用户名和密码。它必须使用进程的标识。

基于这些限制,我写了这段代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Formatting;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace RESTCreateFolder
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            int retVal = p.Process().Result;            
        }

        private async Task<int> Process()
        {
            string url = "http://bi.abhi.com/testweb/";
            using (HttpClient client = new HttpClient(new …
Run Code Online (Sandbox Code Playgroud)

c# officedev dotnet-httpclient sharepoint-2013 office365-apps

4
推荐指数
1
解决办法
6823
查看次数