【发布时间】:2019-09-26 00:35:57
【问题描述】:
在这里,我有 15 种以上调用 SOAP Web 服务的方法中的 2 种
public async void CallWebServiceA() {
var client = new WebServiceWRGClient();
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.MaxReceivedMessageSize = Int32.MaxValue;
binding.MaxBufferSize = Int32.MaxValue;
var endpoint = new EndpointAddress("https://trustonline.delawarecpf.com/tows/webservicewrg.svc");
var channelFactory = new ChannelFactory<WebServiceWRG>(binding, endpoint);
var webService = channelFactory.CreateChannel();
var user = new GRACE_GRACES.User();
user.UserName = await webService.EncryptValueAsync("username");
user.Password = await webService.EncryptValueAsync("password12345");
var response = await client.ClaimSearchAsync(user, "", "", 12345, GRACE_GRACES.statuscode.NotSet, "");
}
public async void CallWebServiceB() {
var client = new WebServiceAWIClient();
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.MaxReceivedMessageSize = Int32.MaxValue;
binding.MaxBufferSize = Int32.MaxValue;
var endpoint = new EndpointAddress("https://trustonline.delawarecpf.com/tows/webserviceawi.svc");
var channelFactory = new ChannelFactory<WebServiceAWI>(binding, endpoint);
var webService = channelFactory.CreateChannel();
var user = new ARM_ARMS.User();
user.UserName = await webService.EncryptValueAsync("username");
user.Password = await webService.EncryptValueAsync("password12345");
var response = await client.ClaimSearchAsync(user, "", "", 12345, ARM_ARMS.statuscode.NotSet, "");
}
我在下面创建了这个通用类,因此我不必为来自同一个提供程序的 15 多个 url/web 服务中的每一个创建多个冗余方法,但是我在传递第二个参数时遇到了一些错误,这是一个接口(来自 Web 服务参考)。
public class WebService<T1, T2, T3> {
private T1 _client;
private T2 _interface;
private T3 _user;
public WebService(T1 wsClient, T2 wsInterface, T3 wsUser) {
_client = wsClient;
_interface = wsInterface;
_user = wsUser;
}
public void CallWebService(string url, string userName, string password) {
var client = _client;
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
var endpoint = new EndpointAddress(url);
var channelFactory = new ChannelFactory<_interface>(binding, endpoint);
var webService = channelFactory.CreateChannel();
var user = _user;
user.UserName = webService.EncryptValue(userName);
user.Password = webService.EncryptValue(password);
var response = client.ClaimSearch(user, "", "", 12345, GraceStatuscode.NotSet, "");
}
}
我在下面这样调用它,但是当我创建实例时在参数中或在创建 ChannelFactory 的新实例时在方法中无法识别接口 WebServiceWRG 和 WebServiceAWI。我得到一条红线,上面写着“找不到命名空间名称_interface的类型”,在我创建新类实例的那一行中,每个接口参数都有一条红线,上面写着“'WebServiceWRG'是一种类型,它不是在给定的上下文中有效”
WebService someServiceA = new WebService(new WebServiceWRGClient(), WebServiceWRG, new GRACE_GRACES.User());
WebService someServiceB = new WebService(new WebServiceAWIClient(), WebServiceAWI, new ARM_ARMS.User());
更新 这是我在下面尝试过的,但仍然有错误: user.UserName = webService.EncryptValue(userName); //Two不包含'UserName'的def,T不包含EncryptValue的def
public class Test {
public void TestWebService() {
var ws = new WebService<WebServiceWRG>();
ws.SearchClaim(new WebServiceWRGClient(), new GraceUser(), "url", "userName", "password");
}
}
public class WebService<T> {
public void SearchClaim<TOne, TTwo>(TOne entity1, TTwo entity2, string url, string userName, string password)
where TOne : class
where TTwo : class
{
var client = entity1;
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
var endpoint = new EndpointAddress(url);
var channelFactory = new ChannelFactory<T>(binding, endpoint);
var webService = channelFactory.CreateChannel();
var user = entity2;
user.UserName = webService.EncryptValue(userName); // username not found, encryptvalue not found
user.Password = webService.EncryptValue(password); // passwordnot found, encryptvalue not found
var response = client.ClaimSearch(user, "", "", 12345, GraceStatuscode.NotSet, ""); // claimsearch not found
}
}
【问题讨论】:
-
这不是泛型的问题,而是您调用
WebService的构造函数的方式的问题。WebService的构造函数需要三个参数。您将使用new关键字创建的对象传递第一个和第三个参数值。第二个参数要作为接口名称传递。这就是它不起作用的方式。您需要传递一个实现接口WebServiceWRG和/或WebServiceWRG的类对象。 -
使用的语法不正确。目前状态下的问题也是不完整的,因此不清楚。这可能是XY problem。
-
你能举个例子吗?
-
@user1186050 这段代码有很多语法问题,但如果没有你的指导,你实际上想做什么,就无法提供太多帮助。
-
我正在将数据发送到在线服务/网络服务(我更新了帖子顶部的代码)以显示该方法。但是我有大约 15 个不同的 url,每个 url/web 服务都有它自己的引用,这些引用是由 .net 生成的。因此,每次我从 Web 服务调用“ClaimSearch()”时,我都必须使用不同的客户端、接口、用户来构造参数。其中每一项都来自不同的服务引用。