Web服务动态调用器问题

3
我已经尝试了一些与Web服务相关的属性,并发现SoapHttpClientProtocol类需要定义一个WebServiceBinding属性。
观看此问题,似乎不能在运行时修改属性,我如何实现动态Web服务调用并在运行时更改此属性?这可能吗?
【编辑】 我正在寻找一种动态调用“通用风格”的方法,而不是修改WebServiceBinding属性。
简而言之,这是我的类:
using System.Web.Services;
using System.Web.Services.Protocols;

namespace Whatever {
    [WebServiceBinding(Name = "", Namespace = "")]
    public class WebServiceInvoker : SoapHttpClientProtocol {
        public WebServiceInvoker(string url, string ns, string bindingName) {

            ChangeNamespace(ns);
            ChangeBinding(bindingName);
            Url = url;
            // credentials, etc
    }
        public void ChangeNamespace(string ns) {
            var att = GetType().GetCustomAttributes(typeof (WebServiceBindingAttribute), true);         
            if (att.Length > 0) {
                // doesn't work
                ((WebServiceBindingAttribute)att[0]).Namespace = ns;
            }
        }
        private void ChangeBinding(string bindingName) {
            var att = GetType().GetCustomAttributes(typeof(WebServiceBindingAttribute), true);

            if (att.Length > 0) {
                // doesn't work
                ((WebServiceBindingAttribute)att[0]).Name = bindingName;
            }
        }
        public object[] MakeInvoke(string method, object[] args) {
            var res = Invoke(method, method);
            return res;
        }

        public TRet InvokeFunction<TRet>(string method) {
            //Funcion<T1, T2, T3, TRet>
            var res = Invoke(method, null);
            return MyUtils.ForceCast<TRet>(res);
        }
        public TRet InvokeFunction<T1, TRet>(string method, T1 par1) {
            //Funcion<T1, T2, T3, TRet>
            var args = new object[] { par1 };
            var res = Invoke(method, args);
            return MyUtils.ForceCast<TRet>(res);
        }
        public TRet InvokeFunction<T1, T2, TRet>(string method, T1 par1, T2 par2) {
            //Funcion<T1, T2, T3, TRet>
            var args = new object[] { par1, par2 };
            var res = Invoke(method, args);
            return MyUtils.ForceCast<TRet>(res);
        }
        public TRet InvokeFunction<T1, T2, T3, TRet>(string method, T1 par1, T2 par2, T3 par3) {
            //Funcion<T1, T2, T3, TRet>
            var args = new object[] {par1, par2, par3};
            var res = Invoke(method, args);
            return MyUtils.ForceCast<TRet>(res);
        }

        public void InvokeAction(string metodo) {
            //Funcion<T1, T2, T3, TRet>
            Invoke(method, null);
        }
        public void InvokeAction<T1>(string method, T1 par1) {
            //Funcion<T1, T2, T3, TRet>
            var args = new object[] { par1 };
            Invoke(method, args);
        }
        public void InvokeAction<T1, T2>(string method, T1 par1, T2 par2) {
            //Funcion<T1, T2, T3, TRet>
            var args = new object[] { par1, par2 };
            Invoke(method, args);
        }
        public void InvokeAction<T1, T2, T3>(string method, T1 par1, T2 par2, T3 par3) {
            //Funcion<T1, T2, T3, TRet>
            var args = new object[] { par1, par2, par3 };
            Invoke(method, args);
        }
    }
}

[编辑]我想这样调用我的类:

var miProxy = new WebServiceInvoker("http://webServiceLocation", "ns", "Binding");
var res = miProxy.InvokeFunction<string, string, Entity>("MyWebMethod", stringPar1, stringPar2);
5个回答

2

你不能在运行时更改属性。它们只是IL代码中的元数据,如果查询属性,则会创建并返回指定属性类的实例。因此,实际的属性实例直到查询它们才存在。

也许可以使用反射修改程序集,但我不确定,而且这可能不是你想尝试的事情。


2

Crows Programming网站上有一个非常好的例子,与此类似。它描述了一个类,允许您在任何Web服务上调用任意消息。它实际上相当流畅。希望这可以帮助。


1

虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Bill the Lizard

1

我不太确定你在这里想要实现什么... 你是想创建一个支持调用调用者任意方法的 Web 服务吗?如果是这样,以下是一个实际应用的示例:创建动态 Web 服务以简化代码


你提供的解决方案很好,我喜欢它,但是我正在寻找一种将通用委托与 Web 服务调用相结合的方法,我的意思是,只要知道其 URL 就可以调用 Web 服务,不知道是否可能。 - Jhonny D. Cano -Leftware-

1

正如您所述,您无法在运行时修改属性。

实现在运行时添加/删除/更改属性的唯一方法是创建一个包装实际类型的新类型。然而,运行时代理类具有开发复杂性和性能方面的开销,并且在生产代码中很少值得使用。

不过,我建议您检查以下语句的正确性:

SoapHttpClientProtocol类需要定义WebServiceBinding属性。

微软通常会给出至少两种解决问题的方法。我敢打赌上述说法并非绝对正确。可能还有其他方法可以实现您想要做的事情。

我的意思是:通过追求运行时属性路线,您可能会走错方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接