#c# #mysql #asp.net-web-api
Вопрос:
У меня есть Web API
, это не работает, что не могу подключиться к этому MYSQL
серверу после его работы в течение около 20 дней,для этого вернитесь в порядке я должен перезапустить сервер ,это очень странно, я попытался подключиться к этому MYSQL
серверу с другого инструментария, как программа работает что-то за то время, что он не может подключиться к базе данных, это не работает так хорошо,он просто не может подключиться к MySQL базам данных, показывающих состояние кода, S1000
или как 10055
(я пробовал в Google, что код, это не работает,я понятия не имею, как решить эту проблему), мой веб-API, встроенный в C# на VS 2015 с EF 5.0, .NET 4.6. Я развернул его на сервере Windows 2008 R2, на этом веб-сервере есть 3 веб-api в IIS, и есть еще сервер, который также является Windows 2008 R2, у него есть сервер MySQL версии 5.5, из-за того,что я просто разработчик, я просто регистрирую исключение на уровне веб-сервера, я пытался найти файлы журналов на стороне MySQL, администратор базы данных не регистрировал ни одного файла в этой базе данных, что было действительно неудачно.
Вот мой код, который является контроллером
public DMLjfretModels uploadjfdetails(DMLjfparamsModels dmlparms)
{
DMLjfretModels dmlret = new Models.DMLjfretModels();
dmlret.returncode = 0;
dmlret.expmsg = "";
if (dmlparms.clicardjftype != "1" amp;amp; dmlparms.clicardjftype != "2" amp;amp; dmlparms.clicardjftype != "4")
{
dmlret.returncode = -30;
return dmlret;
}
if ((dmlparms.clicard??"").Trim().Length != 10)
{
dmlret.returncode = -60;
dmlret.expmsg = "cardno is invald";
return dmlret;
}
try
{
using (var context = new testEntities())
{
context.Database.CommandTimeout = 180;
if (ModelState.IsValid)
{
Globalvariable glv = new Globalvariable();
int result = glv.validate(dmlparms.username, dmlparms.password, dmlparms.curno);
if (result!=0)
{
dmlret.returncode = resu<
return dmlret;
}
string clicardstring = dmlparms.clicard.Trim();
var memberresult = context.wp_client_card.Where(x => x.cli_card == clicardstring);
int therecordscount = memberresult.Count();
try
{
string filePath = @"d:\log\lognumber" DateTime.Now.ToString("yyyy-MM-dd") ".txt";
using (StreamWriter writer = new StreamWriter(filePath, true))
{
writer.WriteLine("cli_card:" clicardstring ?? "" ",listno:" dmlparms.clicardjflistno ?? "" ",countvalue:" therecordscount.ToString());
writer.WriteLine(Environment.NewLine "-----------------------------------------------------------------------------" Environment.NewLine);
}
}
catch (Exception ex)
{
string filePath = @"d:\log\Error" DateTime.Now.ToString("yyyy-MM-dd") ".txt";
using (StreamWriter writer = new StreamWriter(filePath, true))
{
writer.WriteLine("Message :" ex.Message "<br/>" Environment.NewLine "StackTrace :" ex.StackTrace
"" Environment.NewLine "Date :" DateTime.Now.ToString());
writer.WriteLine(Environment.NewLine "-----------------------------------------------------------------------------" Environment.NewLine);
}
}
if (therecordscount == 0)
{
dmlret.returncode = -25;
return dmlret;
}
if (dmlparms.clicardjftype== "1" || dmlparms.clicardjftype == "2")
{
foreach (DMLdetailModels dm in dmlparms.clidetails)
{
if (string.IsNullOrEmpty(dm.prodno) || string.IsNullOrEmpty(dm.batchno)
|| string.IsNullOrEmpty(dm.prodadd) || dm.prodnum <= 0.0 || dm.sellprice <= 0.0
|| dm.stdprice <= 0.0 || dm.clicardjfnum<=0.0)
{
dmlret.returncode = -33;
return dmlret;
}
}
}
else
{
decimal thesum = context.wp_cli_card_jf.Where(x => x.cli_card==dmlparms.clicard.Trim())
.Sum(
d =>
((d.cli_card_jf_type == "1") amp;amp; (d.cli_card_jf_num != null))
? d.cli_card_jf_num
: ((d.cli_card_jf_type == "2") amp;amp; (d.cli_card_jf_num != null))
? ((Decimal?)((Decimal)0) - d.cli_card_jf_num)
: ((d.cli_card_jf_type == "4") amp;amp; (d.cli_card_jf_num != null))
? ((Decimal?)((Decimal)0) - d.cli_card_jf_num)
: (Decimal?)((Decimal)0)
)??0.0M;
decimal thesumjf = 0.0M;
foreach(DMLdetailModels details in dmlparms.clidetails)
{
thesumjf = thesumjf Convert.ToDecimal( details.clicardjfnum);
}
if (thesum< thesumjf)
{
dmlret.returncode = -50;
return dmlret;
}
}
foreach (DMLdetailModels detail in dmlparms.clidetails)
{
//write the data into my database
context.wp_cli_card_jf.Add(wjf);
}
context.SaveChanges();
return dmlret;
}
else
{
dmlret.returncode = -20;
return dmlret;
}
}
}
catch (Exception ex)
{
logfile(ex);
}
}
кстати, я также зарегистрировал запрос и ответ в webapi
public class LogRequestAndResponseHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
String UUID = Guid.NewGuid().ToString();
// log request body
string requestBody = await request.Content.ReadAsStringAsync();
string requestmethod = request.RequestUri.ToString();
string mymethod = requestmethod.ToLower();
// let other handlers process the request
var result = await base.SendAsync(request, cancellationToken);
if (result.Content != null)
{
// once response body is ready, log it
var responseBody = await result.Content.ReadAsStringAsync();
logrequestnresponse(UUID, requestBody, responseBody.ToString(), mymethod);
}
return resu<
}
private void logrequestnresponse(string uuid, string requestbody, string responsebody,string requestmethod)
{
try
{
using (var context = new testEntities())
{
context.Database.CommandTimeout = 180;
wp_web_api_log wplog = context.wp_web_api_log.Create();
wplog.row_index = uuid;
wplog.request_detail = requestbody;
wplog.request_url = requestmethod;
wplog.response_detail = responsebody;
context.wp_web_api_log.Add(wplog);
context.SaveChanges();
}
string filePath = @"d:\log\Logfile.txt";
}
catch (Exception ex)
{
logfile(ex);
}
}
}
my log file logged that it cant connect to MYSQL database during that time
Message :The underlying provider failed on Open<br/>
StackTrace : at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at dggyapi.LogRequestAndResponseHandler.Logrequestnresponse(String uuid, String requestbody, String responsebody, String requestmethod),"},method:querymember
Overall Exception:System.Data.Entity.Core.EntityException: The underlying provider failed on Open---> MySql.Data.MySqlClient.MySqlException: Unable to connect to any of the specified MySQL hosts. ---> System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)
at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)
at System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
at MySql.Data.Common.MyNetworkStream.CreateSocketStream(MySqlConnectionStringBuilder settings, IPAddress ip, Boolean unix)
at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix)
at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.NativeDriver.Open()
--- End of inner exception stack trace ---
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at dggyapi.LogRequestAndResponseHandler.Logrequestnresponse(String uuid, String requestbody, String responsebody, String requestmethod)
Innerexception:System.Net.Sockets.SocketException (0x80004005): An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)
at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)
at System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
at MySql.Data.Common.MyNetworkStream.CreateSocketStream(MySqlConnectionStringBuilder settings, IPAddress ip, Boolean unix)
at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix)
at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.NativeDriver.Open()
Я просто перезапустил свой веб-сервер ,попытался отследить сохраняемость и обнаружил
mysql> show status where variable_name like 'thread%';
------------------- -------
| Variable_name | Value |
------------------- -------
| Threads_cached | 4 |
| Threads_connected | 41 |
| Threads_created | 53302 |
| Threads_running | 2 |
------------------- -------
4 rows in set
mysql> show processlist;
---------- --------- -------------------- -------- --------- ------ ------- ------------------
| Id | User | Host | db | Command | Time | State | Info |
---------- --------- -------------------- -------- --------- ------ ------- ------------------
| 3540670 | myuser | localhost:56924 | NULL | Sleep | 111 | | NULL |
| 3540671 | myuser | localhost:56925 | NULL | Sleep | 111 | | NULL |
| 3540692 | myuser | localhost:56928 | NULL | Sleep | 2 | | NULL |
| 11278418 | myuser | 192.168.0.200:1038 | mydb | Sleep | 44 | | NULL |
| 11278428 | myuser | 192.168.0.200:1043 | mydb | Sleep | 38 | | NULL |
| 11278439 | myuser | 192.168.0.200:1044 | mydb | Sleep | 33 | | NULL |
| 11278441 | myuser | 192.168.0.200:1045 | mydb | Sleep | 15 | | NULL |
| 11278597 | myuser | 192.168.0.200:1077 | mydb | Sleep | 18 | | NULL |
| 11278602 | myuser | 192.168.0.200:1078 | mydb | Sleep | 6 | | NULL |
| 11278627 | myuser | 192.168.0.200:1080 | mydb | Sleep | 102 | | NULL |
| 11278654 | myuser | 192.168.0.200:1082 | mydb | Sleep | 102 | | NULL |
| 11278668 | myuser | 192.168.0.200:1087 | mydb | Sleep | 97 | | NULL |
| 11278710 | myuser | 192.168.0.200:1088 | mydb | Sleep | 89 | | NULL |
| 11278768 | myuser | 192.168.0.200:1089 | mydb | Sleep | 89 | | NULL |
| 11278780 | myuser | 192.168.0.200:1090 | mydb | Sleep | 88 | | NULL |
| 11278781 | myuser | 192.168.0.200:1091 | mydb | Sleep | 85 | | NULL |
| 11278805 | myuser | 192.168.0.200:1092 | mydb | Sleep | 76 | | NULL |
| 11278860 | myuser | 192.168.0.200:1093 | mydb | Sleep | 73 | | NULL |
| 11278877 | myuser | 192.168.0.200:1094 | mydb | Sleep | 66 | | NULL |
| 11278898 | myuser | 192.168.0.200:1099 | mydb | Sleep | 54 | | NULL |
| 11278913 | myuser | 192.168.0.200:1100 | mydb | Sleep | 46 | | NULL |
| 11278935 | myuser | 192.168.0.200:1101 | mydb | Sleep | 42 | | NULL |
| 11303229 | myuser | 192.168.0.200:1833 | mydb | Sleep | 3 | | NULL |
| 11307621 | myuser | 192.168.0.200:2006 | mydb | Sleep | 161 | | NULL |
| 11307953 | myuser | 192.168.0.200:2028 | mydb | Sleep | 93 | | NULL |
| 11307998 | myuser | 192.168.0.200:2029 | mydb | Sleep | 76 | | NULL |
| 11308004 | myuser | 192.168.0.200:2030 | mydb | Sleep | 74 | | NULL |
| 11308244 | myuser | 192.168.0.200:2038 | mydb | Sleep | 147 | | NULL |
| 11308349 | myuser | 192.168.0.200:2044 | mydb | Sleep | 132 | | NULL |
| 11308350 | myuser | 192.168.0.200:2045 | mydb | Sleep | 127 | | NULL |
| 11308387 | myuser | 192.168.0.200:2051 | mydb | Sleep | 126 | | NULL |
| 11308416 | myuser | 192.168.0.200:2052 | mydb | Sleep | 119 | | NULL |
| 11308454 | myuser | 192.168.0.200:2053 | mydb | Sleep | 71 | | NULL |
| 11308460 | myuser | 192.168.0.200:2054 | mydb | Sleep | 98 | | NULL |
| 11308487 | myuser | 192.168.0.200:2055 | mydb | Sleep | 44 | | NULL |
| 11308498 | myuser | 192.168.0.200:2056 | mydb | Sleep | 23 | | NULL |
| 11308542 | myuser | 192.168.0.200:2057 | mydb | Sleep | 13 | | NULL |
| 11308560 | myuser | 192.168.0.200:2058 | mydb | Sleep | 10 | | NULL |
| 11308682 | myuser | server5:5190 | NULL | Sleep | 117 | | NULL |
| 11308722 | myuser | server5:51903 | mydb | Query | 0 | NULL | show processlist |
---------- --------- -------------------- -------- --------- ------ ------- ------------------
40 rows in set
это было нормально?
Комментарии:
1. извините,что возвращаю вас так поздно, большое вам спасибо, сэр @LeandroBardelli, я действительно понимаю это
Ответ №1:
Проблема, кажется, ясна, об ошибке говорится:
System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
Причин этого может быть несколько (вы можете погуглить это), но обычно это связано с отсутствием оборудования, отсутствием обновления сервера, устаревшим обновлением, или вы не удаляете объекты в соединении, или не закрываете соединения, нехваткой памяти, недостаточными ресурсами, но по определению: вы используете много портов.
Вы можете попробовать это:
В Windows Server 2008 R2 Откройте командную строку
Введите следующий netsh int ipv4 set dynamicport tcp start=10000 число=50000 Нажмите Enter
Введите следующий набор ipv4 netsh int dynamicport udp start=10000 число=50000 Нажмите Enter
Введите следующий набор netsh int ipv6 dynamicport tcp start=10000 число=50000 Нажмите Enter
Введите следующий набор ipv6 netsh int dynamicport udp start=10000 число=50000 Нажмите Enter
Дополнительная информация по адресу: http://web.archive.org/web/20160118151510/http://blogs.technet.com/b/askds/archive/2008/10/29/port-exhaustion-and-you-or-why-the-netstat-tool-is-your-friend.aspx
https://blog.whitesites.com/blog.aspx?key=635140180116307813
Комментарии:
1. честно говоря, я не пытался выполнить эти команды ,потому что это была срочная сцена,в которой мне пришлось перезапустить сервер,даже проблема была временной,и проблема еще не была устранена, но я попытаюсь уменьшить количество портов в моем коде, я действительно обращаюсь к вам за помощью, надеюсь, это решит мою проблему