标签: dotnet-httpclient

找不到System.Net.Http 4.2.0.0的奇怪问题

我有一个奇怪的问题,这让我发疯...

我有一个简单的类库项目(完整的.NET Framework,4.6.1),其中包含围绕Cosmos DB的功能的包装类.因此,我已将"Microsoft.Azure.DocumentDB"NuGet Package 1.19.1添加到此项目中.除此之外,我引用了"Newtonsoft.Json"NuGet Package 10.0.3,以及一些"Microsoft.Diagnostics.EventFlow.*"NuGet包.

到目前为止,一切都编译没有任何错误.

但只要我点击我的包装类 - 从简单的Service Fabric无状态服务(完整的.NET Framework 4.6.1)中消耗 - 并尝试执行以下代码行:

_docClient = new DocumentClient(new Uri(cosmosDbEndpointUrl), cosmosDbAuthKey);
Run Code Online (Sandbox Code Playgroud)

我在运行时遇到这个奇怪的错误:

发生System.IO.FileNotFoundException HResult = 0x80070002
消息=无法加载文件或程序集'System.Net.Http,Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该系统找不到指定的文件.
Source = StackTrace:at Microsoft.Azure.Documents.Client.DocumentClient.Initialize(Uri 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, NullableserviceEndpoint ,ConnectionPolicy connectionPolicy,Nullable 1 desiredConsistencyLevel)

内部异常1:FileNotFoundException:无法加载文件或程序集'System.Net.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该系统找不到指定的文件.

我完全没有线索,为什么根本找不到System.Net.Http程序集 - 我的类库项目中甚至有一个程序集引用到.Net Framework程序集"System.Net.Http 4.0.0.0".

我也不明白的是,有这种奇怪的绑定重定向到4.2.0.0 - 哪一个来自?为了解决这个问题,我尝试将以下重定向添加到Service Fabric Service的app.config(使用类库):

但仍然没有区别,我仍然在运行时得到错误.

有人知道吗?有人见过这样的问题吗?

谢谢和问候,OliverB

.net dotnet-httpclient visual-studio-2017 service-fabric-stateless

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

如何将对象传递给HttpClient.PostAsync并序列化为JSON主体?

我正在使用System.Net.Http,我在网上找到了几个例子.我设法创建此代码以发出POST请求:

public static string POST(string resource, string token)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(baseUri);
        client.DefaultRequestHeaders.Add("token", token);

        var content = new FormUrlEncodedContent(new[]
        {
             new KeyValuePair<string, string>("", "")
        });

        var result = client.PostAsync("", content).Result;
        string resultContent = result.Content.ReadAsStringAsync().Result;
        return resultContent;
    }
 }
Run Code Online (Sandbox Code Playgroud)

一切正常.但是假设我想要将第三个参数传递给POST方法,这个参数叫做data.数据参数是这样的对象:

object data = new
{
    name = "Foo",
    category = "article"
};
Run Code Online (Sandbox Code Playgroud)

如何在不创建的情况下做到这一点KeyValuePair?我的php RestAPI等待json输入,所以FormUrlEncodedContent应该raw正确发送json.但我怎么能这样做Microsoft.Net.Http呢?谢谢.

c# json dotnet-httpclient

73
推荐指数
6
解决办法
16万
查看次数

使用.NET 4.0任务模式使用HTTPClient .ReadAsAsync将JSON反序列化为数组或列表

我正在尝试反序列化http://api.usa.gov/jobs/search.json?query=nursing+jobs使用.NET 4.0任务模式返回的JSON .它返回此JSON('加载JSON数据'@ http://jsonviewer.stack.hu/).

[
  {
    "id": "usajobs:353400300",
    "position_title": "Nurse",
    "organization_name": "Indian Health Service",
    "rate_interval_code": "PA",
    "minimum": 42492,
    "maximum": 61171,
    "start_date": "2013-10-01",
    "end_date": "2014-09-30",
    "locations": [
      "Gallup, NM"
    ],
    "url": "https://www.usajobs.gov/GetJob/ViewDetails/353400300"
  },
  {
    "id": "usajobs:359509200",
    "position_title": "Nurse",
    "organization_name": "Indian Health Service",
    "rate_interval_code": "PA",
    "minimum": 42913,
    "maximum": 61775,
    "start_date": "2014-01-16",
    "end_date": "2014-12-31",
    "locations": [
      "Gallup, NM"
    ],
    "url": "https://www.usajobs.gov/GetJob/ViewDetails/359509200"
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

指数行动:

  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      Jobs model = null;
      var …
Run Code Online (Sandbox Code Playgroud)

c# json task-parallel-library asp.net-mvc-4 dotnet-httpclient

69
推荐指数
3
解决办法
15万
查看次数

如何从HttpRequestException获取StatusCode?

我可能在这里遗漏了一些明显的东西.

我正在使用Message字符串中包含的HttpClient哪个throws .HttpRequestExceptionStatusCode

我该如何访问StatusCode


编辑:更多信息,我急着写这个问题.

我正在使用HttpClient我的WebApi项目中的另一个API.是的,我知道我为什么打电话EnsureSuccessStatusCode().我想在下游传播一些错误,例如404和403.

我想要的只是不断变换HttpRequestExceptionHttpResponseException使用自定义ExceptionFilterAttribute.

不幸的是,HttpRequestException除了消息之外,我没有携带任何额外的信息.我希望以StatusCode原始(int或enum)形式发现.

看起来我可以:

  1. 使用该消息切换状态代码(bleh)
  2. 或者创建我的EnsureSuccessStatusCode版本并抛出实际可用的异常.

c# httpexception dotnet-httpclient

67
推荐指数
3
解决办法
5万
查看次数

添加HttpClient标头会生成带有一些值的FormatException

这发生在针对Google Cloud Messaging的编码环境中,但适用于其他地方.

考虑以下:

var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key=XXX");
Run Code Online (Sandbox Code Playgroud)

var http = new HttpClient();
http.DefaultRequestHeaders.Add("Authorization", "key=XXX");
Run Code Online (Sandbox Code Playgroud)

这两个都生成FormatException:

System.FormatException:值key = XXX'的格式无效.

解决方案是删除等号.

  1. 深入研究反射器显示,在添加新的标头值时会运行大量的验证和解析代码.为什么这一切都是必要的?难道这个客户不应该让我们走开吗?

  2. 如何逃避等号以便添加此值成功?

c# dotnet-httpclient google-cloud-messaging

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

是否可以在HttpClient中解压缩之前访问压缩数据?

我正在研究Google Cloud Storage .NET客户端库.有三个功能(在.NET,我的客户端库和存储服务之间)以不愉快的方式组合:

  • 下载文件(Google云端存储术语中的对象)时,服务器会包含存储数据的哈希值.然后,我的客户端代码根据下载的数据验证该哈希值.

  • Google云端存储的一个独立功能是,当请求包含匹配的Accept-Encoding时,用户可以设置对象的Content-Encoding,并在下载时将其作为标题包含在内.(目前,当请求不包括那个时,让我们忽略行为......)

  • HttpClientHandler 可以自动,透明地解压缩gzip(或deflate)内容.

当所有这三个组合在一起时,我们就会遇到麻烦.这是一个简短但完整的程序,演示了这一点,但没有使用我的客户端库(并点击可公开访问的文件):

using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string url = "https://www.googleapis.com/download/storage/v1/b/"
            + "storage-library-test-bucket/o/gzipped-text.txt?alt=media";
        var handler = new HttpClientHandler
        {
            AutomaticDecompression = DecompressionMethods.GZip
        };
        var client = new HttpClient(handler);

        var response = await client.GetAsync(url);
        byte[] content = await response.Content.ReadAsByteArrayAsync();
        string text = Encoding.UTF8.GetString(content);
        Console.WriteLine($"Content: {text}");

        var hashHeader = response.Headers.GetValues("X-Goog-Hash").FirstOrDefault();
        Console.WriteLine($"Hash header: {hashHeader}");

        using (var md5 …
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient

65
推荐指数
3
解决办法
4167
查看次数

具有不同身份验证标头的HttpClient单实例

鉴于.net HttpClient在设计时考虑了重用,并且意图存在很长时间,并且在短期实例中报告内存泄漏.在为多个用户调用端点时,您希望使用不同的承载令牌(或任何授权标头)对给定端点进行静默呼叫的指南行是什么?

private void CallEndpoint(string resourceId, string bearerToken) {
  httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("bearer", bearerToken);
  var response = await httpClient.GetAsync($"resource/{resourceid}");
}
Run Code Online (Sandbox Code Playgroud)

鉴于上述代码可以由Web应用程序上的任意数量的线程调用,第一行中设置的标头很可能与调用资源时使用的标头不同.

在不引起使用锁争用和维护无状态Web应用程序的情况下,为单个端点创建和部署HttpClients的建议方法是什么(我目前的做法是为每个端点创建一个客户端)?


生命周期

尽管HttpClient间接实现了IDisposable接口,但HttpClient的推荐用法并不是在每次请求后都将其处理掉.只要您的应用程序需要发出HTTP请求,HttpClient对象就会存在.在多个请求之间存在一个对象,可以设置一个用于设置DefaultRequestHeaders的地方,并且可以防止您在每次请求时重新指定CredentialCache和CookieContainer之类的内容,这是HttpWebRequest所必需的.

.net c# authorization oauth dotnet-httpclient

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

尝试并行运行多个HTTP请求,但受Windows限制(注册表)

我正在开发一个应用程序(winforms C#.NET 4.0),我通过简单的HTTP请求从第三方访问查找功能.我用一个参数调用一个url,作为回报,我得到一个带有查找结果的小字符串.很简单.

然而,挑战是,我必须做很多这些查找(成千上万),我想限制所需的时间.因此,我想并行运行请求(例如10-20).我使用ThreadPool来做到这一点,我的代码的简短版本如下所示:

public void startAsyncLookup(Action<LookupResult> returnLookupResult)
{
    this.returnLookupResult = returnLookupResult;

    foreach (string number in numbersToLookup)
    {
        ThreadPool.QueueUserWorkItem(lookupNumber, number);
    }
}

public void lookupNumber(Object threadContext)
{
    string numberToLookup = (string)threadContext;
    string url = @"http://some.url.com/?number=" + numberToLookup;
    WebClient webClient = new WebClient();
    Stream responseData = webClient.OpenRead(url);
    LookupResult lookupResult = parseLookupResult(responseData);

    returnLookupResult(lookupResult);
}
Run Code Online (Sandbox Code Playgroud)

我从另一个地方填写numbersToLookup(a List<String>),打电话startAsyncLookup并提供回叫功能returnLookupResult以返回每个结果.这有效,但我发现我没有得到我想要的吞吐量.

最初我认为它可能是第三方的系统结构很差,但我通过尝试同时从两台不同的机器运行相同的代码来排除这种情况.两个人中的每一个都花了一个人,所以我可以排除那一个.

然后一位同事告诉我,这可能是Windows的限制.我google了一下,发现这篇帖子说默认情况下,Windows将同一个Web服务器的同时请求数量限制为HTTP 1.0为4,HTTP 1.1为2(对于HTTP 1.1,这实际上是根据规范( RFC2068)).

上面提到的同一篇文章也提供了增加这些限制的方法.通过向[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings](MaxConnectionsPerServer和MaxConnectionsPer1_0Server)添加两个注册表值,我可以自己控制它.

所以,我尝试了这个(坐到20),重新启动我的电脑,并试图再次运行我的程序.可悲的是,它似乎没有任何帮助.我在运行批量查找时也一直关注资源监视器(参见屏幕截图),我注意到我的应用程序(标题为黑屏的应用程序)仍然只使用了两个TCP连接.

所以,问题是,为什么这不起作用?我使用错误的注册表值链接的帖子是?这可能不再可能在Windows中"破解"(我在Windows 7上)? …

c# multithreading dotnet-httpclient

63
推荐指数
2
解决办法
5万
查看次数

PATCH使用Windows.Web.Http.HttpClient类进行异步请求

我需要PATCHWindows.Web.Http.HttpClient课堂上提出要求,而且没有关于如何做的官方文件.我怎样才能做到这一点?

c# patch http dotnet-httpclient

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

如何使用HttpClient发布数据?

我有来自Nuget的这个 HttpClient.

当我想获取数据时,我这样做:

var response = await httpClient.GetAsync(url);
var data = await response.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

但问题是我不知道如何发布数据?我必须发送一个帖子请求并在其中发送这些值:comment="hello world"questionId = 1.这些可以是一个类的属性,我不知道.

更新我不知道如何将这些值添加到HttpContentpost方法需要它.httClient.Post(string, HttpContent);

c# windows-phone-7 windows-phone dotnet-httpclient windows-phone-8

61
推荐指数
2
解决办法
9万
查看次数