C# 正确中止或取消后同步
在使用HttpClient时,是否有一种保证取消post的方法?我目前正在尝试使用cancellationToken取消一个呼叫do PostAsync,但它似乎并没有实际中止/停止该操作。我仍然可以看到,我上传的图像张贴正确 我是否在这里做错了什么,或者HttpClient是否可能在上传之后才处理取消令牌C# 正确中止或取消后同步,c#,.net,xamarin,dotnet-httpclient,C#,.net,Xamarin,Dotnet Httpclient,在使用HttpClient时,是否有一种保证取消post的方法?我目前正在尝试使用cancellationToken取消一个呼叫do PostAsync,但它似乎并没有实际中止/停止该操作。我仍然可以看到,我上传的图像张贴正确 我是否在这里做错了什么,或者HttpClient是否可能在上传之后才处理取消令牌 var sc = new StreamContent(uploadFile.Data); content.Add(sc, uploadFile.FieldName, uploadFile.F
var sc = new StreamContent(uploadFile.Data);
content.Add(sc, uploadFile.FieldName, uploadFile.FileName);
var request = new HttpRequestMessage
{
RequestUri = new Uri(ApiImageUrlUpload),
Content = content
};
request.Headers.TryAddWithoutValidation("User-Agent", _sessionManager.UserAgent);
request.Headers.TransferEncodingChunked = true;
using(cancellationToken.Register(() => httpClient.CancelPendingRequests()))
httpResponse = await HttpClient.PostAsync(new Uri(ApiImageUrlUpload), content, cancellationToken);
您可以手动处理请求对象,该对象将抛出一个
ObjectDisposedException
,并取消任何网络活动。尝试此代码示例
public partial class LoginForm : MaterialForm
{
static NLog.Logger logger = LogManager.GetLogger("LoginForm");
HttpClient client;
HttpResponseMessage response;
public LoginForm()
{
InitializeComponent();
materialLabelErrMessage.Visible = false;
}
#region GUI events
private void BntCancel_Click(object sender, EventArgs e)
{
CancelLogin();
Close();
}
private void BtnOK_Click(object sender, EventArgs e)
{
Login();
}
private void TextBoxPassword_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Login();
}
}
private void TextBoxUsername_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Login();
}
}
#endregion
#region Keyboard Helpers
protected override bool ProcessDialogKey(Keys keyData)
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
CancelLogin();
Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
#endregion
async void Login()
{
try
{
pbLogin.Visible = true;
btnOK.Enabled = false;
materialLabelErrMessage.Text = string.Empty;
materialLabelErrMessage.Visible = false;
client = new HttpClient();
var user = new User() { Username = textBoxUsername.Text.Trim(), Password = StringUtils.Crypt(textBoxPassword.Text.Trim()) };
var url = Properties.Settings.Default.ServerBaseUrl + @"/api/account/VerifyUserNamePassword";
response = await client.PostAsync(url, user.AsJson());
if (response.IsSuccessStatusCode) // Check the response StatusCode
{
var serSettings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
string responseBody = await response.Content.ReadAsStringAsync();
var loggedUser = JsonConvert.DeserializeObject<User>(responseBody, serSettings);
if (loggedUser.IsLogged == false && loggedUser.UserId == Guid.Empty)
{
logger.Warn(Properties.Resources.LOGINUsernameOrPasswordWrong + " Username:" + user.Username);
BeginInvoke((Action)(() =>
{
materialLabelErrMessage.Text = Properties.Resources.LOGINUsernameOrPasswordWrong;
materialLabelErrMessage.Visible = true;
pbLogin.Visible = false;
btnOK.Enabled = true;
}));
}
else
{
logger.Info(Properties.Resources.LOGINPassed + " Username:" + user.Username);
BeginInvoke((Action)(() =>
{
materialLabelErrMessage.Text = string.Empty;
materialLabelErrMessage.Visible = false;
Program.UserInfo = loggedUser;
DialogResult = DialogResult.OK;
pbLogin.Visible = false;
}));
}
}
else if (response.StatusCode == HttpStatusCode.Forbidden)
{
pbLogin.Visible = false;
btnOK.Enabled = true;
materialLabelErrMessage.Text = Properties.Resources.LOGINUsernameOrPasswordWrong;
materialLabelErrMessage.Visible = true;
logger.Warn(Properties.Resources.LOGINUsernameOrPasswordWrong + " Username:" + user.Username);
}
else
{
pbLogin.Visible = false;
btnOK.Enabled = true;
materialLabelErrMessage.Text = Properties.Resources.LOGINCannotConnectToServer;
materialLabelErrMessage.Visible = true;
logger.Error("Reason: " + response.ReasonPhrase + " Message: " + response.RequestMessage + " Username:" + user.Username);
}
}
catch (ObjectDisposedException ex)
{
logger.Error("Login has been canceled. " + ex.Message);
pbLogin.Visible = false;
btnOK.Enabled = true;
}
catch (Exception ex)
{
logger.Error(Properties.Resources.LOGINUsernameOrPasswordWrong + " " + ex.Message);
pbLogin.Visible = false;
btnOK.Enabled = true;
}
}
void CancelLogin()
{
if (client != null)
{
client.CancelPendingRequests();
client = null;
}
}
}
public分部类LoginForm:MaterialForm
{
静态NLog.Logger Logger=LogManager.GetLogger(“LoginForm”);
HttpClient;
HttpResponseMessage响应;
公共登录表单()
{
初始化组件();
MaterialLabelErrorMessage.Visible=false;
}
#区域GUI事件
私有void BntCancel_单击(对象发送方,事件参数e)
{
Cancelogin();
Close();
}
私有无效BtnOK_单击(对象发送者,事件参数e)
{
登录();
}
私有void TextBoxPassword_KeyDown(对象发送方,KeyEventArgs e)
{
如果(e.KeyCode==Keys.Enter)
{
登录();
}
}
私有void TextBoxUsername\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(e.KeyCode==Keys.Enter)
{
登录();
}
}
#端区
#区域键盘助手
受保护的覆盖布尔ProcessDialogKey(Keys keyData)
{
if(Form.ModifierKeys==Keys.None&&keyData==Keys.Escape)
{
Cancelogin();
Close();
返回true;
}
返回base.ProcessDialogKey(keyData);
}
#端区
异步void登录()
{
尝试
{
pbLogin.Visible=true;
btnOK.Enabled=false;
MaterialLabelErrorMessage.Text=string.Empty;
MaterialLabelErrorMessage.Visible=false;
client=新的HttpClient();
var user=new user(){Username=textBoxUsername.Text.Trim(),Password=StringUtils.Crypt(textBoxPassword.Text.Trim())};
var url=Properties.Settings.Default.ServerBaseUrl+@“/api/account/VerifyUserNamePassword”;
response=wait client.PostAsync(url,user.AsJson());
if(response.issucessStatusCode)//检查响应状态代码
{
var serSettings=new JsonSerializerSettings(){typenameholling=typenameholling.All};
string responseBody=wait response.Content.ReadAsStringAsync();
var loggedUser=JsonConvert.DeserializeObject(responseBy,serSettings);
if(loggedUser.IsLogged==false&&loggedUser.UserId==Guid.Empty)
{
logger.Warn(Properties.Resources.loginusernameorpasswordError+“Username:”+user.Username);
开始(动作)(()=>
{
MaterialLabelErrorMessage.Text=Properties.Resources.LoginUserName或PasswordError;
MaterialLabelErrorMessage.Visible=true;
pbLogin.Visible=false;
btnOK.Enabled=true;
}));
}
其他的
{
logger.Info(Properties.Resources.LOGINPassed+“Username:”+user.Username);
开始(动作)(()=>
{
MaterialLabelErrorMessage.Text=string.Empty;
MaterialLabelErrorMessage.Visible=false;
Program.UserInfo=loggedUser;
DialogResult=DialogResult.OK;
pbLogin.Visible=false;
}));
}
}
else if(response.StatusCode==HttpStatusCode.Forbidden)
{
pbLogin.Visible=false;
btnOK.Enabled=true;
MaterialLabelErrorMessage.Text=Properties.Resources.LoginUserName或PasswordError;
MaterialLabelErrorMessage.Visible=true;
logger.Warn(Properties.Resources.loginusernameorpasswordError+“Username:”+user.Username);
}
其他的
{
pbLogin.Visible=false;
btnOK.Enabled=true;
MaterialLabelErrorMessage.Text=Properties.Resources.LOGINCannotConnectToServer;
MaterialLabelErrorMessage.Visible=true;
logger.Error(“原因:+response.ReasonPhrase+”消息:+response.RequestMessage+”用户名:+user.Username);
}
}
捕获(ObjectDisposedException ex)
{
logger.Error(“登录已被取消。”+ex.Message);
pbLogin.Visible=false;
btnOK.Enabled=true;
}
捕获(例外情况除外)
{
logger.Error(Properties.Resources.loginusernameorPasswordError+“”+ex.Message);
pbLogin.Visible=false;
btnOK.Enabled=true;
}
}
void cancelogin()
{
如果(客户端!=null)
{
client.CancelPendingRequests();
client=null;
}
}
}
Related:该相关问题没有与HTTP相关的答案。