有人请向我解释请求和响应模型在WCF中的工作原理吗?我有一个简单的服务,它使用一个返回rateOfExchange []的整数参数公开一个名为getRateOfExchange的方法,但是从该服务生成的Reference.cs文件包含许多类:
getRateOfExchange(似乎是参数)
getRateOfExchangeRequest
getRateOfExchangeResponse
我已尝试过这些类及其方法的每个排列,但没有任何作用。直观地说,您希望创建一个以参数object作为参数的请求对象,然后将此请求传递给执行请求到服务器的响应的方法。
但不。
一定很痛苦。
有人可以解释一下吗?
更新
谢谢Gigi,但我的课程看起来不像。
如果我关注您的模型,我的请求将如下所示:
CharterServices.charterServiceClient proxy = new CharterServices.charterServiceClient();
using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel));
{
using (proxy as IDisposable)
{
var response = proxy.getRateOfExchange()
}
}
但是,我的getRateOfExchange()方法需要一个getRateOfExchange对象,因此上面的代码不会编译.getRateOfExchange类包含的参数是proxy.getRateOfExchange()方法的参数。我试过创建这个类的实例并传递上面的方法,如下所示:
using (proxy as IDisposable)
{
var rateOfExchange = new Service.getRateOfExchange()
{
charterEnquiryId = 1550003668
};
using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel));
{
using (proxy as IDisposable)
{
var response = proxy.getRateOfExchange(rateOfExchange);
foreach (var rateOfExcchange in response)
{
Debug.WriteLine(rateOfExcchange.fromCurrencyName);
}
}
}
}
但是在尝试调用getRateOfExchange()时它会挂起。
Aaargh!我知道该服务正在运行,因为我可以在SoapUI中执行相同WSDL的请求。
你能帮忙吗?
答案 0 :(得分:1)
实际上并不痛苦。生成代理/客户端类之后,只需创建客户端实例,然后调用这些方法,就好像它们是本地方法调用一样。
我无法解释这里的整个过程,但我会转而提到你一年前写的intro,它用一个简单的例子来解释整个过程。
您甚至可以在编写自己的客户端之前使用WCF测试客户端测试服务。如果使用服务引用,则编写客户端非常容易。
以下摘自该博客帖子中的代码,说明如何使用客户端代码,修改为using
块并使用var
关键字简化:
static void Main(string[] args)
{
using (var service = new ServiceReference1.Service1Client())
{
var response = service.GetData(5);
Console.WriteLine(response);
Console.ReadLine();
}
}
答案 1 :(得分:0)
系统抛出了一个未被捕获的异常,因此组件模型决定挂起!现在修好了。
答案 2 :(得分:-1)
假设rateOfExchange
是List
integers
,我刚刚添加了10个数字,从1到10.
然后,此列表将作为参数发送到服务客户端对象的getRateOfExchange
方法。
List<int> rateOfExchange=new List<int>();
for(int i=0;i<10;i++)
{
rateOfExchange.Add(i);
}
//Service Call
ServiceClient obj=new ServiceClient();
var response=obj.getRateOfExchange(rateOfExchange);
foreach(var item in response)
{
Console.WriteLine(item);
}
Console.ReadLine();
希望它有所帮助。