У меня был рабочий код, в котором данные из базы данных MSSQL использовались для передачи в ссылку на частную службу SAP Bapiret2 через файл wsdl с использованием компонента сценариев SSIS.
Код работал для сред INT, QA и Stage..Все эти среды имели разные адреса конечных точек и сертификаты для установки в IIS.
Данные содержат только около 2000 строк с 10 столбцами.Пример данных выглядит так:
Столбец EngagementName и LocalClientName выбирается как BlobColumn.
Полученные ошибки выглядят следующим образом:
Произошла ошибка при получении ответа HTTP на https://s***.######.com/****Gateway. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP.Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы).Дополнительные сведения см. В журналах сервера.
Базовое соединение было закрыто: соединение, которое, как ожидалось, будет сохранено живым, было закрыто сервером.
Время ожидания канала запроса в ожидании ответа после 00:20:00.Увеличьте значение тайм-аута, передаваемое вызову Request, или увеличьте значение SendTimeout в Binding.Время, отведенное для этой операции, могло быть частью более длительного тайм-аута.
Раньше я не получал ошибок в более ранней среде, но теперь для некоторых строк я получаю ошибку выше.Весь пакет успешно работал за 20 минут, но теперь из-за ошибки он продолжает работать, и мне приходится останавливать его вручную.
Для решений я установил для свойства KeepAlive значение false, но это увеличивает время, в течение которого пакетзапустить и до сих пор я получаю другие ошибки.
Кроме того, через поиск в Google я добавил [DataContract] и [DataMember] в файл BufferWrapper.cs для всех свойств метода установки, но безрезультатно.Но он снова вернулся к более ранней версии без [DataContract] и [DataMember], когда я снова открыл файл .cs.
Также изменили время ожидания с 20 минут на 10 минут, но без перерыва.
Мой кодв компоненте скрипта, как показано ниже:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using SC_33acc229408b4ba595c36ca01338cfef.****_engagement_service;
using System.ServiceModel;
using System.Data.SqlClient;
using System.Net;
using Microsoft.Web.Administration;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
String sSystemID = String.Empty;
String sCert = String.Empty;
String sEndPointAddress = String.Empty;
String sCustomProvider = string.Empty;
public override void PreExecute()
{
base.PreExecute();
/*
* Add your code here
*/
sSystemID = this.Variables.UserID;
sEndPointAddress = this.Variables.EndPointAddress;
sCert = this.Variables.CertID.ToUpper();
sCustomProvider = this.Variables.EngCustomBinding;
}
public override void PostExecute()
{
base.PostExecute();
/*
* Add your code here
*/
}
/// Example of reading a value from a column in the the row:
/// string zipCode = Row.ZipCode
///
/// Example of writing a value to a column in the row:
/// Row.ZipCode = zipCode
/// </summary>
/// <param name="Row">The row that is currently passing through the component</param>
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
System.ServiceModel.Channels.TextMessageEncodingBindingElement textMessage = new System.ServiceModel.Channels.TextMessageEncodingBindingElement()
{
MessageVersion = System.ServiceModel.Channels.MessageVersion.Soap12
};
System.ServiceModel.Channels.HttpsTransportBindingElement httpTransport = new System.ServiceModel.Channels.HttpsTransportBindingElement();
//ServicePointManager.Expect100Continue = true; //mine
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; //mine
httpTransport.ManualAddressing = false;
httpTransport.MaxBufferPoolSize = 2147483647;
httpTransport.MaxReceivedMessageSize = 2147483647;
httpTransport.AllowCookies = false;
httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous;
httpTransport.BypassProxyOnLocal = true;
httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
httpTransport.KeepAliveEnabled = true;
httpTransport.MaxBufferSize = 2147483647;
httpTransport.ProxyAuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous;
httpTransport.Realm = String.Empty;
httpTransport.TransferMode = TransferMode.Buffered;
httpTransport.UnsafeConnectionNtlmAuthentication = false;
httpTransport.RequireClientCertificate = true;
//customBinding.Elements.Add(httpTransport);
System.ServiceModel.Channels.CustomBinding customBinding = new System.ServiceModel.Channels.CustomBinding(textMessage, httpTransport);
customBinding.Name = sCustomProvider;
customBinding.CloseTimeout = new TimeSpan(0, 10, 0);
customBinding.OpenTimeout = new TimeSpan(0, 10, 0);
customBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
customBinding.SendTimeout = new TimeSpan(0, 10, 0);
EndpointAddress endPointAddress = new EndpointAddress(new Uri(sEndPointAddress)); //endpointaddress fr�n parameter
X509Certificate2 _cert = new X509Certificate2();
//_cert = _GetClientCertificate(StoreLocation.CurrentUser, sCert);
_cert = _GetClientCertificate(StoreLocation.LocalMachine, sCert);
//X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
//_cert = _GetClientCertificate(store.Location, sCert); //mine
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HeaderRequestType header = new HeaderRequestType()
{
SystemID = sSystemID, //H�mtas fr�n parameter UserID
UserID = ""
};
string sCon = Connections.dbconn.ConnectionString;
sCon = sCon.Replace("Provider=SQLNCLI11.1;", "");
sCon = sCon.Replace("Auto Translate=False;", "");
ZmrfmMfEngProviderResponse response = new ZmrfmMfEngProviderResponse();
ZmrfmMfEngProvider req = new ZmrfmMfEngProvider();
req.ItEngagement = new ZmrsMfProvider[]
{
new ZmrsMfProvider()
{
Mfid = Row.MemberFirmID,
EngCode = Row.EngagementCode,
LclClntId = Row.LocalClientID,
//EngName = Row.EngagementName,
EngName = System.Text.Encoding.Unicode.GetString(Row.EngagementName.GetBlobData(0, Convert.ToInt32(Row.EngagementName.Length))),
//LclClntName = Row.LocalClientName,
LclClntName = System.Text.Encoding.Unicode.GetString(Row.LocalClientName.GetBlobData(0, Convert.ToInt32(Row.LocalClientName.Length))),
EngCountry = Row.EngagementCountry,
EngIndSector = Row.EngagementIndustrySector,
EngmntLead = Row.EngagementLead,
EngmntManager = Row.EngagementManager,
Active = Row.ActiveFlag,
}
};
String sEngCode = req.ItEngagement[0].EngCode;
String sMFID = req.ItEngagement[0].Mfid;
try
{
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate (object sender, X509Certificate certx, X509Chain chain, SslPolicyErrors sslError)
{
return true;
};
zmrsv_engproviderClient c = new zmrsv_engproviderClient(customBinding, endPointAddress);
c.ClientCredentials.ClientCertificate.Certificate = _cert;
var resp = c.ZmrfmMfEngProvider(ref header, req);
response = (ZmrfmMfEngProviderResponse)resp;
System.Text.StringBuilder sMessage = new System.Text.StringBuilder();
sMessage.Append(response.ItReturn[0].Message);
sMessage.Append(response.ItReturn[0].MessageV1);
sMessage.Append(response.ItReturn[0].MessageV2);
sMessage.Append(response.ItReturn[0].MessageV3);
sMessage.Append(response.ItReturn[0].MessageV4);
System.Text.StringBuilder sSql = new System.Text.StringBuilder();
sSql.Append("INSERT INTO [****].[dbo].[Engagements_log]([Mfid],[Engagement_code],[Date],[ResponseMessage]) ");
sSql.Append("select '" + sMFID + "', '" + sEngCode + "', '" + DateTime.Now.ToString() + "', ");
sSql.Append("'" + sMessage.ToString() + "'");
using (SqlConnection conn = new SqlConnection(sCon))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sSql.ToString(), conn))
{
cmd.ExecuteNonQuery();
}
conn.Close();
}
}
catch (Exception ex)
{
System.Text.StringBuilder strSQL = new System.Text.StringBuilder();
strSQL.Append("insert into [****].[dbo].Engagements_Error_log([Mfid],[EngagementCode],[Date],[ErrorMessage])");
strSQL.Append(" select '" + sMFID + "', '" + sEngCode + "', ");
strSQL.Append("'" + DateTime.Now.ToString() + "', @msg");
using (SqlConnection conn = new SqlConnection(sCon))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn))
{
cmd.Parameters.AddWithValue("@msg", ex.Message);
cmd.ExecuteNonQuery();
}
conn.Close();
}
strSQL.Length = 0;
}
}
private X509Certificate2 _GetClientCertificate(StoreLocation storeLocation, string serialNumber)
{
X509Store store = new X509Store(storeLocation);
store.Open(OpenFlags.ReadOnly);
string newbindinginformation = "*:443:";
int bindingIndex = 0;
try
{
foreach (X509Certificate2 cert in store.Certificates)
{
if (cert.FriendlyName == "StagingCertificateName.com")
{
using (ServerManager serverManager = new ServerManager())
{
Site site = serverManager.Sites["Default Web Site"];
if (site != null)
{
foreach (Microsoft.Web.Administration.Binding binding in site.Bindings)
{
if (binding.BindingInformation == newbindinginformation)
{
bindingIndex = site.Bindings.IndexOf(binding);
}
}
if (bindingIndex != -1)
{
site.Bindings.RemoveAt(bindingIndex);
}
site.Bindings.Add("*:443:", cert.GetCertHash(), store.Name);
//ManagementUnit.Update();
}
}
return cert;
}
}
throw new ArgumentException();
}
finally
{
store.Close();
}
}
}
Код в файле App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="ZMRSV_ENGPROVIDER_soap12">
<!-- WsdlImporter encountered unrecognized policy assertions in ServiceDescription 'urn:sap-com:document:sap:soap:functions:mc-style': -->
<!-- <wsdl:binding name='ZMRSV_ENGPROVIDER_soap12'> -->
<!-- <sapattahnd:Enabled xmlns:sapattahnd="http://www.sap.com/710/features/attachment/">..</sapattahnd:Enabled> -->
<mtomMessageEncoding />
<httpsTransport requireClientCertificate="true" />
</binding>
</customBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="zmrsv_engprovider_int">
<clientCredentials>
<clientCertificate findValue="ST*************.de*******urces.com" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="https://****.######.com/****Gateway" behaviorConfiguration="zmrsv_engprovider_int" binding="customBinding"
bindingConfiguration="ZMRSV_ENGPROVIDER_soap12" contract="****_engagement_service.zmrsv_engprovider"
name="ZMRSV_ENGPROVIDER_soap12" />
</client>
</system.serviceModel>
</configuration>
Пожалуйста, проверьте и посмотрите, где происходит ошибка.
Любая помощьбудет принята с благодарностью.