加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Web Services Dynamic Invoker问题

发布时间:2020-12-16 01:30:12 所属栏目:百科 来源:网络整理
导读:我一直在使用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,TRet>
            var args = new object[] { par1 };
            var res = Invoke(method,args);
            return MyUtils.ForceCast<TRet>(res);
        }
        public TRet InvokeFunction<T1,T1 par1,T2 par2) {
            //Funcion<T1,TRet>
            var args = new object[] { par1,par2 };
            var res = Invoke(method,T2 par2,T3 par3) {
            //Funcion<T1,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,TRet>
            Invoke(method,null);
        }
        public void InvokeAction<T1>(string method,TRet>
            var args = new object[] { par1 };
            Invoke(method,args);
        }
        public void InvokeAction<T1,T2>(string method,par2 };
            Invoke(method,T3>(string method,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读