C# WebApi任务由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作
我正在使用asp.net webapi 当我向返回任务的Webapi端点发出http请求时,偶尔会出现此错误 在这个响应中,我使用wait来确保线程在所有线程完成任务之前不会关闭 基本上我有一个Post方法:C# WebApi任务由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作,c#,sockets,asp.net-web-api,task,C#,Sockets,Asp.net Web Api,Task,我正在使用asp.net webapi 当我向返回任务的Webapi端点发出http请求时,偶尔会出现此错误 在这个响应中,我使用wait来确保线程在所有线程完成任务之前不会关闭 基本上我有一个Post方法: public async Task<HttpResponseMessage> PostHouse(SessionModal sessionModal) { // create database context // Create a new house object
public async Task<HttpResponseMessage> PostHouse(SessionModal sessionModal)
{
// create database context
// Create a new house object
House h = new House();
h.address= await GetFormattedAddress(sessionModal.location)
//save database
}
public async Task<FormattedAdress> GetFormattedAddress(DBGeography Location)
{
var client = new HttpClient();
// create URI
var URI = new URi......
Stream respSream= await client.GetStreamAsync(URI)
// Data Contract Serializer
// Create Formatted Address
FormatedAddress address =....
return address;
}
公共异步任务驿站(SessionModal SessionModal)
{
//创建数据库上下文
//创建新的房屋对象
房屋h=新房屋();
h、 地址=等待GetFormattedAddress(sessionModel.location)
//保存数据库
}
公共异步任务GetFormattedAddress(数据库地理位置)
{
var client=新的HttpClient();
//创建URI
var URI=新URI。。。。。。
Stream respSream=await client.GetStreamAsync(URI)
//数据协定序列化程序
//创建格式化地址
格式化地址地址=。。。。
回信地址;
}
代码工作了一段时间,但随着时间的推移,我开始得到错误响应:
“无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满”
如果重新启动服务器,问题将暂时缓解。如果我一直遇到这个错误,但是我试图发布、获取、删除或放置一个不同的控制器端点,那么它会工作。但是如果我返回并尝试发布端点邮局,我仍然会得到错误
是否有可能线程没有被释放,因此所使用的端口永远不会被释放
编辑
这是我正试图修复的确切代码。我试图使用using(){},但仍然出现错误。我想有些东西我忘记处理了。我几乎是从一篇文章中得到一个图像,然后将其发送到Blob存储。如果有更好的方法,我也不会介意这些建议
public async Task<HttpResponseMessage> Post()
{
var result = new HttpResponseMessage(HttpStatusCode.OK);
if (Request.Content.IsMimeMultipartContent())
{ try{
await Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()).ContinueWith((task) =>
{
MultipartMemoryStreamProvider provider = task.Result;
foreach (HttpContent content in provider.Contents)
{
using (Stream stream = content.ReadAsStreamAsync().Result) {
Image image = Image.FromStream(stream);
var testName = content.Headers.ContentDisposition.Name;
String[] header = (String[])Request.Headers.GetValues("userId");
int userId = Int32.Parse(header[0]);
using (var db = new studytree_dbEntities())
{
Person user = db.People.Find(userId);
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);
//CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
// CloudConfigurationManager.GetSetting("StorageConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve a reference to a container.
CloudBlobContainer container = blobClient.GetContainerReference("profilepic");
// Create the container if it doesn't already exist.
container.CreateIfNotExists();
container.SetPermissions(new BlobContainerPermissions
{
PublicAccess =
BlobContainerPublicAccessType.Blob
});
string uniqueBlobName = string.Format("image_{0}.png",
header[0]);
CloudBlockBlob blob = container.GetBlockBlobReference(uniqueBlobName);
user.ProfilePhotoUri = blob.Uri.ToString();
user.Student.ProfilePhotoUri = blob.Uri.ToString();
user.Tutor.ProfilePhotoUri = blob.Uri.ToString();
using (var streamOut = new System.IO.MemoryStream())
{
image.Save(streamOut, ImageFormat.Png);
streamOut.Position = 0;
blob.UploadFromStream(streamOut);
db.SaveChanges();
}
}
}
}
});
}
catch (Exception e)
{
JObject m= JObject.Parse(JsonConvert.SerializeObject(new {e.Message,e.InnerException}));
return Request.CreateResponse<JObject>(HttpStatusCode.InternalServerError,m);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
}
}
public async Task Post()
{
var结果=新的HttpResponseMessage(HttpStatusCode.OK);
if(Request.Content.IsMimeMultipartContent())
{试试看{
wait Request.Content.ReadAsMultipartAsync(新的MultipartMemoryStreamProvider()).ContinueWith((任务)=>
{
MultipartMemoryStreamProvider provider=task.Result;
foreach(provider.Contents中的HttpContent内容)
{
正在使用(Stream=content.ReadAsStreamAsync().Result){
Image=Image.FromStream(流);
var testName=content.Headers.ContentDisposition.Name;
String[]header=(String[])Request.Headers.GetValues(“userId”);
int userId=Int32.Parse(头[0]);
使用(var db=new studytree\u dbEntities())
{
Person user=db.People.Find(userId);
CloudStorageAccount-storageAccount=CloudStorageAccount.Parse(
ConfigurationManager.ConnectionString[“StorageConnectionString”].ConnectionString);
//CloudStorageAccount-storageAccount=CloudStorageAccount.Parse(
//GetSetting(“StorageConnectionString”);
CloudBlobClient blobClient=storageAccount.CreateCloudBlobClient();
//检索对容器的引用。
CloudBlobContainer容器=blobClient.GetContainerReference(“profilepic”);
//如果容器尚不存在,请创建该容器。
container.CreateIfNotExists();
container.SetPermissions(新BlobContainerPermissions
{
公共访问=
BlobContainerPublicAccessType.Blob
});
string uniqueBlobName=string.Format(“image_{0}.png”,
标题[0]);
CloudBlockBlob blob=container.GetBlockBlobReference(uniqueBlobName);
user.ProfilePhotoUri=blob.Uri.ToString();
user.Student.ProfilePhotoUri=blob.Uri.ToString();
user.Tutor.ProfilePhotoUri=blob.Uri.ToString();
使用(var streamOut=new System.IO.MemoryStream())
{
保存(streamOut,ImageFormat.Png);
流线型。位置=0;
blob.UploadFromStream(streamOut);
db.SaveChanges();
}
}
}
}
});
}
捕获(例外e)
{
JObject m=JObject.Parse(JsonConvert.SerializeObject(new{e.Message,e.InnerException}));
return Request.CreateResponse(HttpStatusCode.InternalServerError,m);
}
返回Request.CreateResponse(HttpStatusCode.OK);
}
其他的
{
抛出新的HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable,“此请求未正确格式化”);
}
}
您没有处理流
试试这个
public async Task<FormattedAdress> GetFormattedAddress(DBGeography Location)
{
using(var client = new HttpClient())
{
var URI = new URi......
using(Stream respSream= await client.GetStreamAsync(URI))
{
FormatedAddress address =....
return address;
}
}
}
公共异步任务GetFormattedAddress(DBGeography位置)
{
使用(var client=new HttpClient())
{
var URI=新URI。。。。。。
使用(Stream respSream=await client.GetStreamAsync(URI))
{
格式化地址地址=。。。。
回信地址;
}
}
}
发生的情况是,您的网络流处于打开状态,而您的计算机可以建立的连接数量有限。如果不处理它们,你就会抓住它们。因此,将来的请求不能使用这些连接。旁注-您可以使用。这样你就不用担心了