我正在尝试使用 HTTPClient 和 REST 在 SP2013 中创建一个文件夹。
以下是对应用程序的要求和限制
我需要使用 REST 在 2013 文档库中创建一个文件夹。不允许 CSOM。
该程序必须是 C# 控制台应用程序。
我必须仅使用 HTTPClient 来调用 Web 服务。不应使用其他旧类或库。
集成身份验证是必须的。您不得在代码中输入您的用户名和密码。它必须使用进程的标识。
基于这些限制,我写了这段代码
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
使用 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
我需要查询发送响应的 Web API,该响应可以加密和/或压缩和/或 Base64 编码,我想将其实现为HttpMessageHandler非常像这篇文章中概述的s链,这是针对 Web API 的尽管。
有一个用于HttpClient获取 的构造函数HttpMessageHandler,所以这是一个开始。我是否必须自己提出链接多个处理程序的解决方案,还是有更好的选择?
当我将请求发布到其余 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) 尝试在请求上设置“ Content-Type”标头属性时,MediaTypeWithQualityHeaderValue参数的用途是什么?MSDN文档只是指出:
表示具有附加质量的内容类型标头值。
“附加质量”的具体含义是什么?
我正在尝试创建一个 .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) 在这里,我试图从服务中获取数据:
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) 我想在此处注册一个类型化的 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
我目前正在使用Blazor,并希望移动我的代码,使其更具可读性和可重用性。在我的剃刀组件中,方法完美无缺-在类中却没有。
在我的组件中,我可以简单地使用:
response = await Http.GetJsonAsync<T>(Uri);
Run Code Online (Sandbox Code Playgroud)
在我的课堂上,Visual Studio抱怨System.Net.Http的HttpClient不包含GetJsonAsync的定义-但是我得到一个类型化的响应,因此我想对其进行反序列化。
我知道,在使用 Microsoft 依赖项注入容器时,处理 HttpClient 实例的最佳做法是使用Microsoft.Extensions.Http nuget 包提供的IHttpClientFactory 接口。
不幸的是,实现IHttpClientFactory 接口的类不是公开的(您可以在此处验证),因此利用此模式的唯一方法是使用 Microsoft 依赖项注入容器(至少这是我所知道的唯一一个)。有时我需要使用不同的容器维护旧的应用程序,因此即使无法使用 IHttpClientFactory 方法,我也需要找出最佳实践。
正如这篇著名文章中所述并在 Microsoft 文档中也得到证实, HttpClient 类旨在在每个应用程序生命周期内实例化一次,并在多个 HTTP 调用中重用。这可以安全地完成,因为用于发出 HTTP 调用的公共方法被记录为线程安全的,因此可以安全地使用单例实例。在这种情况下,请务必遵循本文中给出的提示,以避免与 DNS 更改相关的问题。
到现在为止还挺好。
有时使用BaseAddress或DefaultRequestHeaders 之类的属性很方便,它们不是线程安全的(至少,它们没有被记录为线程安全,所以我假设它们不是)来配置 HttpClient 实例。
这就提出了一个问题:如果我有一个单独的 HttpClient 实例并且在我的代码中的某处我使用属性DefaultRequestHeaders来设置一些常见的 HTTP 请求标头,这对调用我的应用程序需要与之通信的主机之一有用,会发生什么?这是潜在的危险,因为不同的主机可能需要相同请求标头的不同值(以身份验证为例)。此外,由于缺乏线程安全保证,从两个线程同时修改DefaultRequestHeaders可能会扰乱 HttpClient 实例的内部状态。
由于所有这些原因,我认为使用 HttpClient(当 IServiceCollection 不可用时)的最佳方法如下:
为应用程序需要与之通信的每个主机创建一个 HttpClient 实例。对一个特定主机的每次调用都将使用 HttpClient 的相同实例。对同一主机的并发调用是安全的,因为用于执行调用的方法的线程安全性已记录在案。
为应用程序需要与之通信的每个主机创建一个服务。HttpClient 实例被注入到这个服务中,并且服务本身在应用程序中被用作单例。该服务用于抽象出对其耦合的主机的访问。像这样的类是完全可测试的,如图所示 …