标签: dotnet-httpclient

在 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
查看次数

httpclient - 如何将 Content-Disposition 设置为“application/json;” 在一个多部分

使用 System.Net.Http.Httpclient,我正在尝试使用 C# 和 wp8 进行多部分发布。

这是我的代码片段:

varclient = new HttpClient();

client.DefaultRequestHeaders.TryAddWithoutValidation(    
"Content-Type", "application/json");

content = new MultipartFormDataContent();
content.Add(new StringContent(requestObj, Encoding.UTF8, "application/json"), "request");
Run Code Online (Sandbox Code Playgroud)

但是使用 Fiddler,我注意到我正在发送:

内容配置:表单数据;名称=请求

内容类型:文本/纯文本;字符集=utf-8

虽然我需要发送这个(取自正在通话的 android 设备):

内容配置:应用程序/json;名称=“请求”

内容类型:文本/纯文本;字符集=UTF-8

  • 如何达到预期的效果?

c# multipart dotnet-httpclient windows-phone-8

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

HttpClient 可以有多个 HTTP 消息处理程序吗?

我需要查询发送响应的 Web API,该响应可以加密和/或压缩和/或 Base64 编码,我想将其实现为HttpMessageHandler非常像这篇文章中概述的s链,这是针对 Web API 的尽管。

有一个用于HttpClient获取 的构造函数HttpMessageHandler,所以这是一个开始。我是否必须自己提出链接多个处理程序的解决方案,还是有更好的选择?

asp.net asp.net-mvc dotnet-httpclient

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

httpClient.PostAsync 中的线程被中止问题

当我将请求发布到其余 api 时,程序将崩溃并且线程将被中止。请指教。

    public async Task<TResponse> Post<TRequest, TResponse>(string method, TRequest request)
    {
            JsonMediaTypeFormatter jsonFormat = new JsonMediaTypeFormatter
            {
                SerializerSettings =
                {
                    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
                    NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
                    PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None
                }
            };

            var response = await _httpClient.PostAsync(_baseUrl + method, request, jsonFormat);
            var finalResponse = await response.Content.ReadAsAsync<TResponse>();

            return finalResponse;
    }
Run Code Online (Sandbox Code Playgroud)

请注意,不会向服务器发送任何请求。顺便说一下,_httpClient 将被定义如下

        _httpClient =
            new HttpClient(new HttpClientHandler
                {
                    AutomaticDecompression =
                        System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate
                })
                {Timeout = TimeSpan.FromSeconds(50)};
        _httpClient.DefaultRequestHeaders.Add("Authorization", "apikey " + apiKey);
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient

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

C#HttpClient:为什么选择MediaTypeWithQualityHeaderValue?

尝试在请求上设置“ Content-Type”标头属性时,MediaTypeWithQualityHeaderValue参数的用途是什么?MSDN文档只是指出:

表示具有附加质量的内容类型标头值。

“附加质量”的具体含义是什么?

.net c# asp.net dotnet-httpclient

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

使用 HttpClient 将大文件分块上传到 Controller,IFormFile 始终为空

我正在尝试创建一个 .Net 标准“客户端”类,用于将(有时非常大)文件上传到控制器。我想通过将文件分成块并一次上传一个来做到这一点。目的是让其他应用程序使用它而不是直接与 Web Api 通信。

我已经让控制器工作了。我已经验证它可以使用支持块保存的 Kendo-ui 控件工作。

我遇到的问题是,IEnumerable<IFormFile> files从我的客户端类发布时,我的控制器的参数始终为空

控制器

[Route("api/Upload")]
public ActionResult ChunkSave(IEnumerable<IFormFile> files, string metaData, Guid id)
{
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(metaData));
    var serializer = new DataContractJsonSerializer(typeof(ChunkMetaData));
    ChunkMetaData somemetaData = serializer.ReadObject(ms) as ChunkMetaData;

    // The Name of the Upload component is "files"
    if (files != null)
    {
        // If this is the first chunk, try to delete the file so that we don't accidently
        // and up appending new bytes to the old …
Run Code Online (Sandbox Code Playgroud)

c# file-io dotnet-httpclient asp.net-core-mvc

4
推荐指数
2
解决办法
9121
查看次数

无法将字符串转换为 system.Net.HttpContent

在这里,我试图从服务中获取数据:

public async Task<IHttpActionResult> ValidateSesion()
{
    var values = new Dictionary<string, string>{
        { "productId", "1" },
        { "productKey", "Abc6666" },
        { "userName", "OPPO" },
    };
    var json = JsonConvert.SerializeObject(values, Formatting.Indented);
    // var content = new FormUrlEncodedContent(json);
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = await client.PostAsync("http://172.116.12.172:8014/iadmin/validate", json);
    var responseString = await response.Content.ReadAsStringAsync();
    return Ok(responseString);
}
Run Code Online (Sandbox Code Playgroud)

如果我进行任何 PostMan 调用,如下所示,我得到的数据如下所示:

{
    "productId": "1",
    "productKey": "Abc6666" 
}
Run Code Online (Sandbox Code Playgroud)

c# json asp.net-web-api dotnet-httpclient

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

如何将多个 HttpClient 参数传递/注入到类型化的 HttpClientClass?

我想在此处注册一个类型化的 HttpClient Microsoft docs。基本上,该方法应该是

services.AddHttpClient();

通常,这些类的模式仅接收 HttpClient 类作为参数,并且您实现调用端点的逻辑。就我而言,我需要在 MyHttpClient 中使用 2 个 HttpClient,一个 ping 端点,另一个与 IdentityProvider 对话以发现 refreshEndpoints 以刷新我的 cookie。

public class MyHttpClient : IMyHttpClient
{
    public MyHttpClient (HttpClient httpClient, 
                         HttpClient refreshHttpClient)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我试图从控制器解析 IMyHttpClient,我会收到一条错误消息,指出它无法解析 HttpClient。

在第 43 行AddHttpClient的 GitHub 代码中,您可以看到它正在调用 DefaultTypedHttpClientFactory。如果您转到DefaultTypedHttpClientFactory 实现的实现,您会注意到它是一个泛型类型。当它调用 CreateClient 时,它只向第 39 行的构造函数传递一个参数。

我在这里看到的唯一解决方法是不创建类型化客户端并注册接收 IHttpClientFactory 的普通类,并动态创建和配置我的客户端,而不是类型化。还有其他想法吗?

c# dependency-injection dotnet-httpclient .net-core asp.net-core

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

HttpClient没有为GetJsonAsync定义

我目前正在使用Blazor,并希望移动我的代码,使其更具可读性和可重用性。在我的剃刀组件中,方法完美无缺-在类中却没有。

在我的组件中,我可以简单地使用:

response = await Http.GetJsonAsync<T>(Uri);
Run Code Online (Sandbox Code Playgroud)

在我的课堂上,Visual Studio抱怨System.Net.Http的HttpClient不包含GetJsonAsync的定义-但是我得到一个类型化的响应,因此我想对其进行反序列化。

.net c# dotnet-httpclient

4
推荐指数
3
解决办法
2545
查看次数

可以为我的应用程序需要与之通信的每个主机使用一个 HttpClient 实例吗?

我知道,在使用 Microsoft 依赖项注入容器时,处理 HttpClient 实例的最佳做法是使用Microsoft.Extensions.Http nuget 包提供的IHttpClientFactory 接口

不幸的是,实现IHttpClientFactory 接口的类不是公开的(您可以在此处验证),因此利用此模式的唯一方法是使用 Microsoft 依赖项注入容器(至少这是我所知道的唯一一个)。有时我需要使用不同的容器维护旧的应用程序,因此即使无法使用 IHttpClientFactory 方法,我也需要找出最佳实践。

正如这篇著名文章中所述在 Microsoft 文档中也得到证实, HttpClient 类旨在在每个应用程序生命周期内实例化一次,并在多个 HTTP 调用中重用。这可以安全地完成,因为用于发出 HTTP 调用的公共方法被记录为线程安全的,因此可以安全地使用单例实例。在这种情况下,请务必遵循本文中给出的提示,以避免与 DNS 更改相关的问题。

到现在为止还挺好。

有时使用BaseAddressDefaultRequestHeaders 之类的属性很方便,它们不是线程安全的(至少,它们没有被记录为线程安全,所以我假设它们不是)来配置 HttpClient 实例。

这就提出了一个问题:如果我有一个单独的 HttpClient 实例并且在我的代码中的某处我使用属性DefaultRequestHeaders来设置一些常见的 HTTP 请求标头,这对调用我的应用程序需要与之通信的主机之一有用,会发生什么?这是潜在的危险,因为不同的主机可能需要相同请求标头的不同值(以身份验证为例)。此外,由于缺乏线程安全保证,从两个线程同时修改DefaultRequestHeaders可能会扰乱 HttpClient 实例的内部状态。

由于所有这些原因,我认为使用 HttpClient(当 IServiceCollection 不可用时)的最佳方法如下:

  • 为应用程序需要与之通信的每个主机创建一个 HttpClient 实例对一个特定主机的每次调用都将使用 HttpClient 的相同实例。对同一主机的并发调用是安全的,因为用于执行调用的方法的线程安全性已记录在案。

  • 为应用程序需要与之通信的每个主机创建一个服务。HttpClient 实例被注入到这个服务中,并且服务本身在应用程序中被用作单例。该服务用于抽象出对其耦合的主机的访问。像这样的类是完全可测试的,如图所示 …

.net c# http dotnet-httpclient .net-core

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