Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF难题:请求和响应类_C#_Wcf - Fatal编程技术网

C# WCF难题:请求和响应类

C# WCF难题:请求和响应类,c#,wcf,C#,Wcf,有人能给我解释一下请求和响应模型在WCF中是如何工作的吗?我有一个简单的服务,它公开了一个名为getRateOfExchange的方法,其中包含一个返回rateOfExchange[]的整数参数,但从该服务生成的Reference.cs文件包含许多类: getRateOfExchange(似乎是参数) getRateOfExchangeRequest getRateOfExchangeResponse 我尝试了这些类的每一种排列方式及其方法,但没有任何效果。直观地说,您希望创建一个以parame

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

getRateOfExchange(似乎是参数)

getRateOfExchangeRequest

getRateOfExchangeResponse

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

但是没有

一定很痛苦

有人能解释一下吗

更新

谢谢你,吉吉,但我的课看起来不像那样

如果我遵循您的模型,我的请求如下所示:

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

using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel));
{
    using (proxy as IDisposable)
    {
        var response = 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()方法需要getRateOfExchange对象,因此无法编译上述代码。getRateOfExchange类包含的参数是proxy.getRateOfExchange()方法的参数。我已尝试创建该类的实例并将其传递给上面的方法,如下所示:

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

using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel));
{
    using (proxy as IDisposable)
    {
        var response = 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()时挂起

啊!我知道该服务正在工作,因为我可以在SoapUI中执行对同一WSDL的请求


你能帮忙吗?

其实一点也不痛。生成代理/客户机类后,只需创建客户机实例,然后调用方法,就好像它们是本地方法调用一样

我不能在这里解释整个过程,但我会让你参考我在一年前写的,用一个简单的例子来解释整个过程

甚至在编写自己的客户端之前,您就可以使用WCF测试客户端测试服务。如果您使用服务引用,那么编写客户机非常容易

下面是该博客文章中代码的摘录,说明了如何使用客户机代码,为了简洁起见,修改为使用
using
块并使用
var
关键字:

    static void Main(string[] args)
    {
        using (var service = new ServiceReference1.Service1Client())
        {
            var response = service.GetData(5);
            Console.WriteLine(response);

            Console.ReadLine();
        }
    }

假设
rateofchange
是一个
整数列表
,我刚刚添加了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();
List rateofchange=new List();

对于(int i=0;i系统抛出了一个未被捕获的异常,因此组件模型决定挂起!现在修复了它。

我不确定您所说的“挂起”是什么意思,但如果您将一个对象作为参数传递,则它需要有一个DataContract。当您创建一个新的WCF应用程序时,代码中有一个示例,或者请参见此处:与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。请参见"。将<代码>与WCF代理一起使用<代码>被认为是不好的做法:我使用类似的代码从我的服务中获取汇率,但正如我所说的,在调用服务时它会挂起。我所说的挂起是指进入服务代码中运行并且永不返回。我到底会做错什么?感谢Tim的链接,这非常有趣。我将检查我的代码并应用此模式!我使用了类似的代码从我的服务获取汇率,但正如我所说的,在调用服务时它会挂起。我所说的挂起是指进入服务代码以运行并永不返回。我到底会做错什么?再次尝试重新生成代理。也许您的参数rateOfExchange是too太大或太长。或者服务中有一些错误。您是否使用WCF测试客户端单独测试了服务?