我为ASP.NET MVC WebAPI 2创建了分离项目,我想调用Register方法.(我使用的项目默认是由VS2013创建的.)
[Authorize]
[RoutePrefix("api/Account")]
public class AccountController : ApiController
{
....
// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
IdentityUser user = new IdentityUser
{
UserName = model.UserName
};
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
IHttpActionResult errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
我使用一个简单的WPF应用程序来执行此操作.我不确定调用此方法的语法,并将用户名和密码传递给它RegisterBindingModel.
public partial class MainWindow : Window
{
HttpClient client;
public …Run Code Online (Sandbox Code Playgroud) 我有一个循环遍历一个简短的列表,URIs需要发送每个相同的内容.它HttpContent驻留在传递给调用的变量中PostAsync.我遇到的问题是第一次调用工作正常,但所有后续调用都失败,因为请求内容是null在第一次调用完成之后.
我认为我对PostAsync封面下的电话的理解可能缺乏对象的一些低级细节,而且它的生命周期(或缺乏),所以希望有人可以为我阐明它.
代码如下:
HttpResponseMessage httpResponseMessage = httpClient.PostAsync(destionationUri, messageContent).Result;
Run Code Online (Sandbox Code Playgroud)
有问题的变量是从中衍生出来messageContent的类型.我想一些将值复制到一个新的独立位置以供重用的粗暴方法可能会起作用,但我希望了解为什么会发生这种情况以及允许内容在循环期间保持不变的正确方法.MultipartFormDataContentHttpContent
有谁知道我如何解决这个问题,并在循环上面的代码时,messageContent值将在迭代之间持续存在?
编辑:我继续和重构的代码重建的MultipartFormDataContent使用之前,每次调用相同的数据从头开始PostAsync使用新的实例HttpClient.重建HtppContent实际工作的呼吁; 该值不为null.但是,当我现在去进行后续调用PostAsync和访问时,.Result我收到以下错误:
将内容复制到流时出错.无法访问封闭的Stream.
编辑2:在检查第二次调用我的方法MultipartFormDataContent从头开始重建对象时,我注意到我的附件属性在检查它的ContentStream属性(Mail.MailMessage对象)时声明如下:
attachment.ContentStream.Position抛出了类型的异常
System.ObjectDisposedException
所有属性都表明ContentStream无法再读取它,因为它已被丢弃.呼吁PostAsync().Result显然是处理流并且可能是根本问题.但是我仍然无法找到可行的解决方案.
在我的Windows应用商店应用程序(c#)中,我需要将MultipartFormDataContent(一些字符串内容和一些文件)上传到服务器并在响应时获取一个巨大的文件.问题 - 我不能用BackgroundDownloaders它.我只能使用一个请求.
我用的HttpClient.PostAsync方法:
using (var client = new HttpClient(httpClientHandler))
{
using (var content = new MultipartFormDataContent())
{
content.Add(...); // prepare all strings and files content
try
{
using (var response = await client.PostAsync(url, content))
{
if (response.StatusCode == HttpStatusCode.OK)
{
var inputBytes = await response.Content.ReadAsByteArrayAsync();
// some operations with inputBytes
}
......
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何计算此操作的进度?
注意:我的目标 - Windows 8.我无法使用Windows.Web.Http.HttpClient(支持最低客户端Windows 8.1).只要System.Net.Http.HttpClient
HttpClient.PostAsync方法的行为是处理提供的HttpContent对象.
有许多方法可以解决这种问题,包括HttpContent为客户端上的每个调用构建一个new ,或者将内容加载到流中并更改指针.
我想知道为什么调用此方法会自动调用其IDisposable参数的处理?据我所知,这不是.NET中的常见行为
还值得注意的是,这种行为也在PUT请求中被观察到,这是幂等的,因此这种行为是为了防止再次发送信息的前提似乎不正确.
我使用WebClient从restfull服务(.net web api)获取Xml对象,一切都很好:
using(WebClient client = new WebClient())
{
client.Encoding = UTF8Encoding.UTF8;
client.Headers[HttpRequestHeader.ContentType] = "text/xml";
client.Credentials = // ....;
xmlResult = webClient.DownloadString(url);
}
....
Run Code Online (Sandbox Code Playgroud)
这段代码效果很好.我得到一个Xml作为字符串回来,大家都很高兴.
现在,我更改了它,因此它可以与HttpClient一起使用而且我无法返回Xml - 总是将json作为字符串.
using(var handler = new HttpClientHandler() {Credentials = new NetworkCredentials})
using(var client = new HttpClient(handler))
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add(HttpRequestHeader.ContentType.ToString(), "text/xml");
returnedXml = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我怎样才能获得我想要的Xml?
谢谢
从这个问题的答案:HttpClient和HttpClientHandler必须处理?,我发现最好的做法是不要处理System.Net.Http.HttpClient每个HTTP请求.特别指出:
HttpClient的标准用法是不要在每次请求后处理它.
这没关系.
我的问题是,这种"模式"是否也适用于此Windows.Web.Http.HttpClient?或者它应该按HTTP请求处理?我认为文档对此有点模糊.在其中一个样本中,它只是说明:
// Once your app is done using the HttpClient object call dispose to
// free up system resources (the underlying socket and memory used for the object)
httpclient.Dispose();
Run Code Online (Sandbox Code Playgroud)
我相信这可以通过两种方式阅读,因此对此有任何具体的意见.
背景
我正在构建一个双层应用程序:
Winforms客户端将使用WebAPI服务HttpClient.两层都大量使用IoC和依赖注入设计模式
题
当Winforms应用程序需要来自WebAPI服务的数据时,演示者将协调请求.我的问题是,你会HttpClient直接在演示者内部使用吗?为了保持演示者的可测试性,您如何确保不必依赖具体的HttpClient电话?我想在某种程度上也整合了这个问题的最佳答案.
c# design-patterns winforms asp.net-web-api dotnet-httpclient
我正在尝试通过自签名证书发出失败的Web请求:
Client = new HttpClient();
HttpResponseMessage Response = await Client.GetAsync(Uri)//defined elsewhere
Run Code Online (Sandbox Code Playgroud)
这会引发信任失败异常.
我httpclienthandler按照这里的建议再次尝试使用HttpClient允许不受信任的SSL证书:
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback =
(
HttpRequestMessage message,
X509Certificate2 cert,
X509Chain chain,
SslPolicyErrors errors
) =>{return true; };//remove if this makes it to production
Client = new HttpClient(handler);
Run Code Online (Sandbox Code Playgroud)
这会引发一个未实现异常的系统.
有没有其他方法可以信任自签名证书?我甚至在机器上安装了证书,但没有运气.
我有一个执行GET请求的.NET Core 2.0控制台应用程序。
似乎已发布的版本未Accept-Encoding在测试计算机上发送 用于压缩的标头,但在我的本地计算机上可用。
我找不到其他任何可能导致压缩失败的先决条件。两者都运行.NET Core 2.1.4 SDK。
我已经通过dotnet Console.dll在两种环境中运行对控制台应用程序进行了测试。
dotnet Console.dll。验证Fiddler中是否存在标题。dotnet Console.dll再次运行,并使用Fiddler验证服务器上缺少标头。我都尝试过HttpClient,RestSharp而且我很困惑。
进入与请求标头相呼应的页面的概念验证:
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
using (var client = new HttpClient(handler))
{
response = client.GetStringAsync("http://scooterlabs.com/echo").Result;
}
Run Code Online (Sandbox Code Playgroud)
本地环境(Win10)
GET http://scooterlabs.com/echo HTTP/1.1
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Host: scooterlabs.com
Run Code Online (Sandbox Code Playgroud)
服务器(AWS上的Win2008 R2)
GET http://scooterlabs.com/echo HTTP/1.1
Connection: Keep-Alive
Host: scooterlabs.com
Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×4
.net-core ×1
asp.net-mvc ×1
dispose ×1
http-post ×1
idisposable ×1
winforms ×1
xamarin ×1
xamarin.ios ×1