我写了一个C#应用程序,它与部署在另一台机器上的(ASMX)web服务进行通信。 webservice连接到位于第三层的后端数据库并对其执行操作。ASMX webservice到ORACLE DB在第一个连接上超时
应用程序中的所有数据库操作都是从名为DataLayerFunctor
的静态类中调用的。这里是该类的一个片段:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WebserviceTest.DataLayer;
using WebserviceTest.SecurityLayer;
using SettingsAlias = WebserviceTest.Properties;
namespace WebserviceTest
{
public static class DataLayerFunctor
{
public static MyWebserviceReference.Service1 myWebService;
private static string HOST = "192.168.1.100";
private static string PORT = "1521";
private static string DATABASE = "orcl";
private static string USERNAME = "MY_USER";
private static string PASSWORD = "123";
private static string ORACLE_CONNECTION_STRING = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={2})));Users Id={3};Password={4};";
public static List<UserGroup> UserGroupsList { get; set; }
public static List<Role> RolesList { get; set; }
public static Dictionary<UserGroup,Role> GroupsToRoles { get; set; }
static DataLayerFunctor()
{
HOST = CryptoServices.DecryptText(SettingsAlias.Settings.Default.HOST,CryptoServices.DEFAULT_KEY) ?? HOST;
PORT = CryptoServices.DecryptText(SettingsAlias.Settings.Default.PORT,CryptoServices.DEFAULT_KEY)?? PORT;
DATABASE = CryptoServices.DecryptText(SettingsAlias.Settings.Default.DATABASE,CryptoServices.DEFAULT_KEY) ?? DATABASE;
USERNAME = CryptoServices.DecryptText(SettingsAlias.Settings.Default.USER_NAME,CryptoServices.DEFAULT_KEY) ?? USERNAME;
PASSWORD = CryptoServices.DecryptText(SettingsAlias.Settings.Default.PASSWORD,CryptoServices.DEFAULT_KEY) ?? PASSWORD;
ORACLE_CONNECTION_STRING = SettingsAlias.Settings.Default.ORACLE_CONNECTION_STRING ?? ORACLE_CONNECTION_STRING;
HOST = "192.168.1.6";
PORT = "1521";
DATABASE = "orcl";
USERNAME = "ALAMAL_BANK";
PASSWORD = "123";
myWebService = new MyWebserviceReference.Service1();
myWebService.Url = "http://192.168.1.6/MyWebservice/Service1.asmx";
//myWebService.Url = CryptoServices.DecryptText(SettingsAlias.Settings.Default.WebserviceURL,CryptoServices.DEFAULT_KEY);
myWebService.Timeout = 36000;
//Load enumeration tables
LoadGroupsToRoles();
}
public static void LoadGroupsToRoles() {
string query = "SELECT * FROM GROUPS_TO_ROLES";
DataTable groupsToRoles = myWebService.GetTableParamOracle(query, HOST, PORT, DATABASE, USERNAME, PASSWORD);
GroupsToRoles = new Dictionary<UserGroup, Role>();
foreach (DataRow groupsToRolesRow in groupsToRoles.Rows)
{
Role role = RolesList.First((i) => i.RoleId == groupsToRolesRow["ROLE_ID_FK"] as long?);
UserGroup userGroup = UserGroupsList.First((i) => i.GroupId == groupsToRolesRow["GROUP_ID_FK"] as long?);
GroupsToRoles.Add(userGroup, role);
}
}
}
}
问题是首次连接到数据库总是失败。因此,我需要重新运行应用程序才能获得部署应用程序时无法接受的连接。另一件事是连接在几分钟后重置。我如何保持连接活着?
我使用:
的Oracle 11g数据库
ODP.NET
C#4
SOAP的Webservice
Webservice的代码:
public class Service1 : System.Web.Services.WebService
{
logger.LogCreator _log = new logger.LogCreator(@"C:\GDW_logs");
public static long DataTableCounter = 1;
string oracleConnection = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1})))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={2})));User Id={3};Password={4};";
[WebMethod]
public DataTable GetTableParamOracle(string sqltext, string host, string port, string database, string username, string password)
{
OracleConnection SQLConnection = new OracleConnection(string.Format(oracleConnection, host, port, database, username, password));
OracleDataAdapter dad = new OracleDataAdapter(sqltext, SQLConnection);
DataTable dtb = new DataTable("DataTable" + (DataTableCounter++));
SQLConnection.Open();
try
{
dad.Fill(dtb);
}
catch (Exception ex)
{
_log.WriteLine(ex.Message);
}
finally
{
SQLConnection.Close();
}
return dtb;
}
}
ASMX是一项传统技术,不应该用于新开发。 WCF应该用于Web服务客户端和服务器的所有新开发。一个暗示:微软已经在MSDN上退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)。 – 2013-04-04 14:32:49
你可以发布服务中的代码吗?客户端代码没有告诉我们你在用Oracle做什么。 – Tridus 2013-04-04 14:34:19
@Tridus我为webservice添加了一个用于所用方法的片段。即,GetTableParamOracle。 – 2013-04-04 14:47:52