我很遗憾Fiddler一直在运行我在插件中开发此功能,因为部署到客户端后我发现它对任何人都不起作用 - 除非他们也运行小提琴!如果我停止运行Fiddler,它也无法在我的开发机器上运行。
主要错误是Error while copying content to a stream.
。因此,我调查了GC在完成命中服务器之前释放数据的可能性(对我而言,解释了为什么运行Fiddler解决了它 - 因为我相信请求已发送首先是Fiddler,然后是Fiddler将其发送到服务器)。但是,我无法找到支持这可能是问题的任何事情。我已经尝试确保它保留数据,但我不觉得我走的是正确的路线。
代码大致如下:
POST
完整的例外情况包括:
HttpClientHandler httpHandler = new HttpClientHandler { UseDefaultCredentials = true };
var client = new HttpClient(httpHandler, false);
client.BaseAddress = new Uri(BaseUrl + "api/job/PostTest");
var content = new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture));
content.Add(new StringContent(mailItem.HTMLBody, Encoding.UTF8), "BodyHtml");
// content.Add()'s... Omitted for brevity
var response = client.PostAsync(BaseUrl + "api/job/PostTest", content);
response.ContinueWith(prevTask => {
if (prevTask.Result.IsSuccessStatusCode)
{
System.Diagnostics.Debug.WriteLine("Was success");
}
else
{
System.Diagnostics.Debug.WriteLine("Was Error");
}
}, System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion);
response.ContinueWith(prevTask =>{
MessageBox.Show(prevTask.Exception.ToString());
}, System.Threading.Tasks.TaskContinuationOptions.OnlyOnFaulted);
如果有人能指出一些有助于我的资源或指出我哪里出错会对我有所帮助!
答案 0 :(得分:1)
经过大量搜索并且非常混乱我使用HttpClient
无法解决此问题,因此我所做的就是使用WebClient
。如果其他人在将来遇到这个问题,我会发布我最终使用的内容:
System.Net.WebClient wc = new System.Net.WebClient();
wc.Headers.Add("Content-Type", String.Format("multipart/form-data; boundary=\"{0}\"", multipartFormBoundary));
wc.UseDefaultCredentials = true;
try
{
var wcResponse = wc.UploadData(BaseUrl + "api/job/PostJobEmailNote", byteArray);
}
catch(Exception e)
{
// response status code was not in 200's
}
答案 1 :(得分:0)
我认为问题可能在于使用返回void的匿名函数。他们有点问题。将我的lambda更改为返回bool的lambda为我解决了这个问题。
答案 2 :(得分:0)
在开发我们的IronBox Outlook插件时,我们遇到了这个问题。我们发现,在VSTO上下文中,ServicePointManager支持的安全协议仅为Tls和Ssl3(无法与仅支持TLS 1.2或更高版本的API配合使用)。
您可以从这样的VSTO代码中轻松检查此情况(这是我们挂接到Application.ItemSend事件时的示例):
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
// Handle event when item is sent
this.Application.ItemSend += Application_ItemSend;
}
private void Application_ItemSend(object Item, ref bool Cancel)
{
foreach (var c in (SecurityProtocolType[])Enum.GetValues(typeof(SecurityProtocolType)))
{
if (ServicePointManager.SecurityProtocol.HasFlag(c))
{
Debug.WriteLine(c.ToString());
}
}
Cancel = false;
}
我们通过将ServicePointManager.SecurityProtocol属性设置为支持Tls12来解决了这个问题,
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
希望有一天能对某人有所帮助
凯文