Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebApi任务由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作_C#_Sockets_Asp.net Web Api_Task - Fatal编程技术网

C# WebApi任务由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作

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

我正在使用asp.net webapi 当我向返回任务的Webapi端点发出http请求时,偶尔会出现此错误

在这个响应中,我使用wait来确保线程在所有线程完成任务之前不会关闭

基本上我有一个Post方法:

 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))
{
格式化地址地址=。。。。
回信地址;
}
}
}
发生的情况是,您的网络流处于打开状态,而您的计算机可以建立的连接数量有限。如果不处理它们,你就会抓住它们。因此,将来的请求不能使用这些连接。

旁注-您可以使用。这样你就不用担心了