我有一个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位很简单,但是如何将文件内容与名称一起添加到帖子中?
我有一个Microsoft.Net.Http用于检索一些Json数据的服务.大!
当然,我不希望我的单元测试击中实际的服务器(否则,这是一个集成测试).
这是我的服务ctor(使用依赖注入......)
public Foo(string name, HttpClient httpClient = null)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我不知道我怎么可以......比如嘲笑这个.. Moq或FakeItEasy.
我想确保当我的服务电话GetAsync或PostAsync..然后我可以伪造这些电话.
有什么建议我怎么做?
我希望 - 我不需要制作我自己的Wrapper ..因为这是废话:(微软不能对此进行疏忽,对吧?
(是的,它很容易制作包装..我之前已经完成了它们......但这是重点!)
我正在编写一个使用ASP.NET Web API代理某些HTTP请求的应用程序,我正在努力识别间歇性错误的来源.这似乎是一种竞争条件......但我并不完全确定.
在我详细介绍之前,这里是应用程序的一般通信流程:
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) 考虑重定向的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) 我们正在开发Web API RESTful服务,以便为我们企业的所有应用程序提供对公共数据的访问.为了帮助我们,我们还将发布一个客户端API,它封装了所有HttpClient详细信息,并提供了对数据的强类型访问.
我们的目标是开始小规模并逐步添加功能,同时仍然保持与已部署版本的客户端API的向后兼容性(与相同主要版本的客户端兼容)
在谈到设计,我们的团队刚刚约了很长的讨论,我们是否应该共享的服务器和客户端之间的类型(通过versionned的NuGet包实例服务器和客户端将取决于),并结束了与利弊和缺点......我们无法决定这种或那种方式.
优点
缺点
优点
缺点
我们团队的每个解决方案似乎都有50/50的偏好.
我个人有第二种选择的偏好,因为我相信其余的都是关于去耦和去耦意味着客户端不应该在乎如何在服务器端实现(其类型,或者它是否是一个.NET应用程序反正),但希望我们可以摆脱可能的重复,也许可以归功于代码生成或类似的东西,但无法找到关于这个主题的任何指导
在客户端和服务器之间共享类型还有其他优缺点吗?
如果我们不共享它们,是否有办法在尝试保持客户端模型和服务器模型同步时降低维护成本?
有些人可以帮我了解如何将多个对象从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
我有一个大文件,我必须发送到web api客户端...数据是多部分.问题是,如果文件是通过http Web请求发送的,那么它会在webapi上快速上传.对于此请求,文件内容将直接写入请求流.
就好像通过Httpclient(.net 4.5)发送相同的文件一样,与http web请求相比,上传速度很慢.我在Httpclient post async中使用multipartformdatacontent.
那么,对于大文件,我们是否只能使用Web请求?或者Httpclient上是否有任何设置可以加快上传速度?
我正在尝试使用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) 我正在构建一个给出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) 我正在玩.Net Core并构建一个利用支付API的API.需要将客户端证书添加到双向SSL身份验证请求中.如何使用HttpClient在.Net Core中实现这一目标?
我查看了各种文章,发现HttpClientHandler没有提供添加客户端证书的任何选项.
请指教