当前位置 : 主页 > 编程语言 > c语言 >

c# – Web Services Dynamic Invoker问题

来源:互联网 收集:自由互联 发布时间:2021-06-25
我一直在使用Web服务上的属性,我已经看到SoapHttpClientProtocol类需要定义一个WebServiceBinding属性. 看到这个question似乎无法修改运行时的属性,如何实现动态Web服务调用在运行时更改此属性?
我一直在使用Web服务上的属性,我已经看到SoapHttpClientProtocol类需要定义一个WebServiceBinding属性.

看到这个question似乎无法修改运行时的属性,如何实现动态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);
我不确定你要在这里完成什么…你是否正在尝试创建一个支持调用者调用任意方法的Web服务?如果是这样,这里有一个例子: Creating a dynamic Web service to simplify code
网友评论