Как добавить класс делегата для класса диспетчера служб при вызове службы мыла в C#?

Прежде всего, я хочу поделиться своим сценарием, что я хочу построить -
Сценарий: я создаю клиентское приложение, используя wpf. В некоторых случаях мне нужно вызвать веб-сервис для получения данных с сервера. Чтобы сделать это, я добавил веб-ссылку, используя wsld url. И я создал класс ServiceManager, который будет вызывать метод обслуживания. В целях безопасности мне нужно добавить некоторую информацию заголовка в запросе soap xml, например, UserToken, SAML Token и так далее. Я могу это из моего класса ServiceManager. Но я хочу добавить еще один класс, который будет вызываться перед отправкой запроса на сервер. В этом классе я сделаю что-то вроде добавления заголовка безопасности к запросу soap xml с запросом, а затем отправлю его на сервер.

Я использовал SOAP Extension для достижения своей цели, и он работает хорошо. Но проблема в том, что каждый раз мне нужно добавить аннотацию в файле Reference.cs (для каждой ссылки на веб-сервис) в начале метода сервиса. Я считаю, что есть какой-то другой простой способ сделать это лучше, чем SOAP Extension. Есть ли способ, где я могу только вызвать службу, и класс делегата будет вызван автоматически, и мне не нужно добавлять какие-либо аннотации в ссылочный файл? Я поделюсь своим примером кода здесь.

Класс ServiceManage:

public class ServiceManager
{ 
public UserDataService dataService; //web service added at Web Reference
public ServiceManager()
{
dataService = new UserDataService();
getUserServiceRequest rqst = new getUserServiceRequest();
getUserServiceResponse resp = dataService.getUser(rqst);
}
}

Reference.cs

[TraceExtensionAttribute(Name = "First")]
public getUserServiceResponse getUser([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] getUserServiceRequest request) {
object[] results = this.Invoke("getUser", new object[] {
                  request});
return ((getUserServiceResponse)(results[0]));
}

TraceExtensionAttribute.cs

[AttributeUsage(AttributeTargets.Method)]
public class TraceExtensionAttribute : SoapExtensionAttribute
{
     private string mstrName = null;
     public override Type ExtensionType
     {
         get { return typeof(TraceExtension); }
     }
     public override int Priority
     {
        get { return 1; }
         set { }
     }
     public string Name
     {
         get { return mstrName; }
         set { mstrName = value; }
      }
}

TraceExtension.cs

 public class TraceExtension : SoapExtension
{
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attr){//..do something}
    public override void Initialize(object initializer){//..do something}
    public override Stream ChainStream(Stream stream){//...do something}
    public override void ProcessMessage(SoapMessage message) {//..do something}
}

1 ответ

Наконец-то я нашел решение. Просто через веб-ссылку и добавьте сервисную ссылку вместо этого. Затем перейдите по следующей ссылке. Меня устраивает.

Другие вопросы по тегам