标签: dotnet-httpclient

ASP.NET WebApi:如何使用WebApi HttpClient执行带文件上载的多部分帖子

我有一个WebApi服务从一个简单的表单处理上传,如下所示:

    <form action="/api/workitems" enctype="multipart/form-data" method="post">
        <input type="hidden" name="type" value="ExtractText" />
        <input type="file" name="FileForUpload" />
        <input type="submit" value="Run test" />
    </form>
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何使用HttpClient API模拟相同的帖子.这个FormUrlEncodedContent位很简单,但是如何将文件内容与名称一起添加到帖子中?

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

57
推荐指数
3
解决办法
6万
查看次数

如何在.NET测试中传入一个模拟的HttpClient?

我有一个Microsoft.Net.Http用于检索一些Json数据的服务.大!

当然,我不希望我的单元测试击中实际的服务器(否则,这是一个集成测试).

这是我的服务ctor(使用依赖注入......)

public Foo(string name, HttpClient httpClient = null)
{
...
}
Run Code Online (Sandbox Code Playgroud)

我不知道我怎么可以......比如嘲笑这个.. MoqFakeItEasy.

我想确保当我的服务电话GetAsyncPostAsync..然后我可以伪造这些电话.

有什么建议我怎么做?

我希望 - 我不需要制作我自己的Wrapper ..因为这是废话:(微软不能对此进行疏忽,对吧?

(是的,它很容易制作包装..我之前已经完成了它们......但这是重点!)

.net c# mocking microsoft-fakes dotnet-httpclient

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

Web Api + HttpClient:在异步操作仍处于挂起状态时完成的异步模块或处理程序

我正在编写一个使用ASP.NET Web API代理某些HTTP请求的应用程序,我正在努力识别间歇性错误的来源.这似乎是一种竞争条件......但我并不完全确定.

在我详细介绍之前,这里是应用程序的一般通信流程:

  • 客户端代理服务器1发出HTTP请求.
  • 代理1将HTTP请求的内容中继到代理2
  • 代理2将HTTP请求的内容中继到目标Web应用程序
  • Target Web App响应HTTP请求,并将响应流式传输(分块传输)到Proxy 2
  • 代理2将响应返回给代理1,代理1又响应原始呼叫客户端.

Proxy应用程序使用.NET 4.5在ASP.NET Web API RTM中编写.执行中继的代码如下所示:

//Controller entry point.
public HttpResponseMessage Post()
{
    using (var client = new HttpClient())
    {
        var request = BuildRelayHttpRequest(this.Request);

        //HttpCompletionOption.ResponseHeadersRead - so that I can start streaming the response as soon
        //As it begins to filter in.
        var relayResult = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;

        var returnMessage = BuildResponse(relayResult);
        return returnMessage;
    }
}

private …
Run Code Online (Sandbox Code Playgroud)

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

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

如何配置HttpClient在收到301 HTTP状态代码时不自动重定向?

考虑重定向的ASP.NET Web API服务

public class ThisController : ApiController
{
    /* more methods */

    public override HttpResponseMessage Post()
    {
        var result = new HttpResponseMessage(HttpStatusCode.MovedPermanently);
        // Post requests should be made to "ThatController" instead.
        string uri = Url.Route("That", null);
        result.Headers.Location = new Uri(uri, UriKind.Relative);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

试图验证POST数据到"api/this"会将你重定向到"api/that",我有以下测试方法:

[TestMethod]
public void PostRedirects()
{
    using (var client = CreateHttpClient("application/json"))
    {
        var content = CreateContent(expected, "application/json");
        using (var responseMessage = client.PostAsync("api/this", content).Result)
        {
            Assert.AreEqual(HttpStatusCode.MovedPermanently, responseMessage.StatusCode);
            Assert.AreEqual(new Uri("https://api.example.com/api/that"), responseMessage.Headers.Location);
        }
    }
}

protected HttpClient …
Run Code Online (Sandbox Code Playgroud)

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

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

我应该在Web API服务和它的客户端之间共享类型吗?还有什么其他选择?

我们正在开发Web API RESTful服务,以便为我们企业的所有应用程序提供对公共数据的访问.为了帮助我们,我们还将发布一个客户端API,它封装了所有HttpClient详细信息,并提供了对数据的强类型访问.

我们的目标是开始小规模并逐步添加功能,同时仍然保持与已部署版本的客户端API的向后兼容性(与相同主要版本的客户端兼容)

在谈到设计,我们的团队刚刚约了很长的讨论,我们是否应该共享的服务器和客户端之间的类型(通过versionned的NuGet包实例服务器和客户端将取决于),并结束了与利弊和缺点......我们无法决定这种或那种方式.

在客户端和服务器之间共享类型(共享程序集)

优点

  • 客户端模型和服务器模型始终是最新的
  • 没有序列化/反序列化问题,因为相同类型被序列化/反序列化
  • 没有重复

缺点

  • 需要找到一种方法来共享服务器和客户端之间的类型
  • 非语义修改可以破坏现有的客户端应用程序(在服务器模型中更改类的名称或其名称空间),即使它对序列化的json没有影响,因此应该没有影响
  • 没有意识到打破克林的风险

客户端和服务器的单独(但结构上等效)类型

优点

  • 客户端"模型"较少耦合到服务器实现(只是服务器的Json输出的镜像,但没有硬"相同类型"关系)
  • 服务器模型可以发展而没有破坏任何客户端的风险
  • 能够独立于服务器模型增强客户端模型
  • 客户端模型是客户端软件包的一部分,在服务器和客户端之间没有"共享软件包"

缺点

  • 服务器代码和客户端代码之间的重复
  • 保持服务器端和客户端结构同步的容易出错的任务

我们团队的每个解决方案似乎都有50/50的偏好.

我个人有第二种选择的偏好,因为我相信其余的都是关于去耦和去耦意味着客户端不应该在乎如何在服务器端实现(其类型,或者它是否是一个.NET应用程序反正),但希望我们可以摆脱可能的重复,也许可以归功于代码生成或类似的东西,但无法找到关于这个主题的任何指导

在客户端和服务器之间共享类型还有其他优缺点吗?

如果我们不共享它们,是否有办法在尝试保持客户端模型和服务器模型同步降低维护成本

.net asp.net-web-api dotnet-httpclient

44
推荐指数
2
解决办法
6049
查看次数

将多个复杂对象传递给post/put Web API方法

有些人可以帮我了解如何将多个对象从C#控制台应用程序传递到Web API控制器,如下所示?

using (var httpClient = new System.Net.Http.HttpClient())
{
    httpClient.BaseAddress = new Uri(ConfigurationManager.AppSettings["Url"]);
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));   

    var response = httpClient.PutAsync("api/process/StartProcessiong", objectA, objectB);
}
Run Code Online (Sandbox Code Playgroud)

我的Web API方法是这样的:

public void StartProcessiong([FromBody]Content content, [FromBody]Config config)
{

}
Run Code Online (Sandbox Code Playgroud)

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

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

HttpClient与HttpWebRequest

我有一个大文件,我必须发送到web api客户端...数据是多部分.问题是,如果文件是通过http Web请求发送的,那么它会在webapi上快速上传.对于此请求,文件内容将直接写入请求流.

就好像通过Httpclient(.net 4.5)发送相同的文件一样,与http web请求相比,上传速度很慢.我在Httpclient post async中使用multipartformdatacontent.

那么,对于大文件,我们是否只能使用Web请求?或者Httpclient上是否有任何设置可以加快上传速度?

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

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

C#中的HttpClient Multipart Form Post

我正在尝试使用C#中的HttpClient进行多部分表单发布,并且发现以下代码不起作用.

重要:

var jsonToSend = JsonConvert.SerializeObject(json, Formatting.None, new IsoDateTimeConverter());
var multipart = new MultipartFormDataContent();
var body = new StringContent(jsonToSend, Encoding.UTF8, "application/json");

multipart.Add(body);
multipart.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), "test", "test.txt");

var httpClient = new HttpClient();
var response = httpClient.PostAsync(new Uri("http://localhost:55530"), multipart).Result;
Run Code Online (Sandbox Code Playgroud)

完整计划:

namespace CourierMvc.Worker
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Hit any key to make request.");
                Console.ReadKey();

                try
                {
                    var request = new RestRequest(Method.POST)
                    {
                        Resource = "http://localhost:55530"
                    };

                    var json = new CourierMessage
                    {
                        Id = …
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient

41
推荐指数
3
解决办法
6万
查看次数

重试HttpClient不成功的请求

我正在构建一个给出HttpContent对象的函数,它将发出请求并在失败时重试.但是我得到异常,说HttpContent对象在发出请求后被处理掉.无论如何都要复制或复制HttpContent对象,以便我可以发出多个请求.

 public HttpResponseMessage ExecuteWithRetry(string url, HttpContent content)
 {
  HttpResponseMessage result = null;
  bool success = false;
  do
  {
      using (var client = new HttpClient())
      {
          result = client.PostAsync(url, content).Result;
          success = result.IsSuccessStatusCode;
      }
  }
  while (!success);

 return result;
} 

// Works with no exception if first request is successful
ExecuteWithRetry("http://www.requestb.in/xfxcva" /*valid url*/, new StringContent("Hello World"));
// Throws if request has to be retried ...
ExecuteWithRetry("http://www.requestb.in/badurl" /*invalid url*/, new StringContent("Hello World"));
Run Code Online (Sandbox Code Playgroud)

(显然我不会无限期地尝试,但上面的代码基本上就是我想要的).

它产生了这个例外

System.AggregateException: One or more errors occurred. ---> System.ObjectDisposedException: …
Run Code Online (Sandbox Code Playgroud)

c# httpcontent dotnet-httpclient

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

将客户端证书添加到.net核心Httpclient

我正在玩.Net Core并构建一个利用支付API的API.需要将客户端证书添加到双向SSL身份验证请求中.如何使用HttpClient在.Net Core中实现这一目标?

我查看了各种文章,发现HttpClientHandler没有提供添加客户端证书的任何选项.

请指教

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

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