【发布时间】:2024-01-18 07:12:01
【问题描述】:
我在 SSIS 包中有一个脚本任务来调用 Web 服务 (WCF)。我要做的就是向 Web 服务发送一个请求,然后我会收到一个结果(1 或 0)。但是,如果失败并显示以下错误消息。当我将代码放在窗口应用程序表单中时,它可以工作。
我几乎从一个窗口应用程序中复制了代码,并试图让它在 SSIS 中工作。不幸的是,我不知道 Web 服务是如何工作的,也不知道从哪里开始寻找解决方案。我需要做任何绑定吗?有一个应用程序配置文件,但它说 CustomBinding。再次,我为我缺乏知识道歉,我完全一无所知。任何帮助,将不胜感激。谢谢!
在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(对象 obj,对象 [] 参数,对象 [] 参数) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams) 在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
以下是我在脚本任务中的代码。
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
// TODO: Add your code here
ServiceReference.SendMessageClient svc = new ServiceReference.SendMessageClient();
MessageCredentialsHeader MessageSecurityHeader = new MessageCredentialsHeader("user", "pw");
try
{
using (System.ServiceModel.OperationContextScope contextScope = new System.ServiceModel.OperationContextScope(svc.InnerChannel))
{
System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(MessageSecurityHeader);
MessageBox.Show(svc.SendMessage("111", "222", "SSIS test").Result.ToString());
}
}
catch (Exception ex)
{
string s = ex.Message;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public class MessageCredentialsHeader: System.ServiceModel.Channels.MessageHeader
{
public string Username { get; set; }
public string Password { get; set; }
public MessageCredentialsHeader(string username, string password)
{
Username = username;
Password = password;
}
public override string Name
{
get { return "Security"; }
}
public override string Namespace
{
get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
}
public override bool MustUnderstand
{
get
{
return true;
}
}
protected override void OnWriteStartHeader(XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion)
{
base.OnWriteStartHeader(writer, messageVersion);
string prefix = writer.LookupPrefix("http://schemas.xmlsoap.org/soap/envelope/");
writer.WriteAttributeString(prefix + ":actor", "http://example.org/ws/webservicesecurity");
}
protected override void OnWriteHeaderContents(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion)
{
writer.WriteStartElement("UsernameToken", Namespace);
writer.WriteStartElement("Username", Namespace);
writer.WriteRaw(Username);
writer.WriteEndElement();
writer.WriteStartElement("Password", Namespace);
writer.WriteAttributeString("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
writer.WriteRaw(Password);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}
【问题讨论】:
标签: c# web-services wcf ssis