2015-01-11 93 views
1

请问有人请问向我解释请求和响应模型如何在WCF中工作?我有一个简单的服务,公开一个名为getRateOfExchange的方法,其中包含一个返回rateOfExchange []的整数参数,但从服务生成的Reference.cs文件包含许多类:WCF的困境:请求和响应类

getRateOfExchange(似乎是参数)

getRateOfExchangeRequest

getRateOfExchangeResponse

我尝试了这些类及其方法的每个排列但没有任何工程。直观上你会希望创建一个以参数对象作为参数的请求对象,然后将这个请求传递给执行请求的响应方法给服务器。

但是没有。

它必须是痛苦的。

有人能解释一下吗?

UPDATE

谢谢梁咏琪,但我的课并不像说。

如果我按照你的模型,我的要求是这样的:

CharterServices.charterServiceClient proxy = new CharterServices.charterServiceClient(); 

using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel)); 
{ 
    using (proxy as IDisposable) 
    { 
     var response = proxy.getRateOfExchange() 
    } 
}      

但是,我getRateOfExchange()方法需要一个getRateOfExchange对象,所以上面的代码不compile.The 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

我不确定你的意思是“挂起”,但如果你传递一个对象作为参数,那么它需要一个DataContract。在创建新的WCF应用程序时,代码中有一个示例,或者请参阅此处:http://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx – Gigi

+0

与论坛网站不同,我们不使用“谢谢”或“任何帮助表示赞赏”,或在[所有]上签名。请参阅“[应该'嗨','谢谢',标语和致敬从帖子中删除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be - 从我的帖子中删除) –

回答

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(); 
     } 
    } 
+0

感谢Gigi,请参阅我上面的更新 – serlingpa

+1

在WCF代理中使用'using'被认为是不好的做法:[避免使用语句的问题](http://msdn.microsoft.com /en-us/library/aa355056%28v=vs.110%29.aspx) – Tim

+0

我使用了类似的代码来从我的服务中获得汇率,但正如我所说的,它在调用服务时会挂起。我的意思是挂起进入服务代码运行,永远不会返回。什么是我可以做的错误? – serlingpa

-1

假设rateOfExchangeintegers一个List,我刚刚添加了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(); 

希望它有帮助。

+0

我用类似的代码来获得交换来自我的服务的费率,但正如我所说的,它在拨打服务时会挂起,我的意思是韩ging正在进入服务代码运行并且从不返回。我到底能做什么错? – serlingpa

+0

尝试再次重新生成代理。也许你的参数rateOfExchange太大或太长。或者服务中存在一些错误。您是否使用WCF测试客户端单独测试了服务? – Anurag

0

系统抛出一个没有被捕获的异常,所以组件模型决定挂起!现在修复它。