使用类型列表<of t =“”> </of>调用客户端WCF服务

时间:2009-10-20 01:58:06

标签: wcf parameters types client

我正在设计一个同时显示上传的多文件上传服务 每个文件的进度。

如果我要将我的WCF方法设计为SOAP合约,我会这样做 像这样的东西:

var request = IService.UploadMethod(List<Upload> request);

但是,如何传递“List<Upload>”类型的参数“”request“” 当我从客户端调用方法时(../upload.svc/ uploadpictures / “” 请求 “”)?

帮助表示感谢,谢谢。

2 个答案:

答案 0 :(得分:0)

你正在使用SOAP,就像你自己说的那样 - 这意味着你不能只从URL(REST风格)调用你的服务方法,因为你发布的第二部分意味着(../upload.svc/ uploadpictures) / “请求”)。

您需要在SOAP中执行此操作(假设您已使用Visual Studio或svcutil创建了客户端代理):

// create client side proxy, reading URI etc. from config
ServiceClient clientProxy = new ServiceClient();

List<Upload> _list = new List<Upload>();

// add your uploads - don't know what that is - just a filename? The actual
// contents of the file? That's up to you
_list.Add(..........);

var response = clientProxy.UploadMethod(_list);

马克

答案 1 :(得分:0)

感谢您的回答。

我正在使用SOAP作为我的部分API,但我也在使用webhttp端点 用于REST - 样式的xhr调用和JSON响应。我能够做到这一点 该计划的其他地方:

var url = "trade.svc/GetCategoryChildren/" + parentID + "/json";
        var httpStatus;
        xmlhttp.open("GET", url, true);
        xmlhttp.send(null);

我正在尝试为我的上传服务做同样的事情但是,正如你所指出的那样 out,收集List<Upload> request = new List<Upload>();是C#,而不是JavaScript 我不太确定如何以REST方式传递参数。这可能吗? 思想赞赏?

<service behaviorConfiguration="Default" name="WebClient.UploadService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" name="MyJSONUploadEP" contract="WebClient.IJSONUploadService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:2534/Web/upload.svc" />
          </baseAddresses>
        </host>
      </service>

响应萨哈 -

请求应该类似于我在上一篇文章中概述的xmlhttp请求对象。您希望将端点作为xmlhttp.open(“GET”,url,true)中的URL参数传递。您的参数应遵循相同的约定:“service.svc / function / param1 / param2 / param3”。

在服务器上,您希望将服务的绑定设计为webHttpBinding - 在我发布的配置文件中查看MyJSONUploadEP。然后,在您的合同(在我的示例中,WebClient.IJSONUploadService)中,您希望为所请求的方法指定具有JSON的respone格式的WebGet属性。在我的合同中,我有:

[WebGet(UriTemplate = "GetCategoryChildrenJSON/{parentID}/{format}", ResponseFormat = WebMessageFormat.Json)]
Tuple<string, int> GetCategoryChildren(string parentID, string format);

顺便说一下,我发现为不同的响应格式(IJSONUploadService.cs,IPOXUploadService.cs和ISOAPUploadService.cs,然后根据需要继承)签订不同的合同很有用。因此,例如,您的WCF类看起来像:

public class UploadService : IJSONUploadService

如果你想在你的JSON响应中返回一些整数,你应该设计一个get / set类型为integer的支持类 - 如:

 public class Items
     {
        public int PropA { get; set; }
        public int PropB { get; set; }
        public int PropC { get; set; }
        public int PropD { get; set; }
        public int PropE { get; set; }
        etc... 
     }

然后,在从数据库中检索数据后,您需要填充 你的列表(在这种情况下是类型的项目):

List<Items> categories = new List<Items>();

接下来,您需要序列化要发送回的类型项列表 给客户。我正在使用一个名为JSONHelper的类来执行此操作但有 互联网上有很多例子。你可以先查一下 “System.Runtime.Serialization.Json”命名空间。这是我的目标 序列化看起来像:

string dtSerialized = JSONHelper.Serialize<List<Items>>(categories);
Tuple<int, int> retParam = new Tuple<int, int>(dtSerialized, errCode);
return retParam;

最后,在客户端上,您需要使用某种JavaScript响应处理程序来处理JSON响应。网上有很多这样的例子 - 你可以 想尝试从http://json.org/js.html开始。

HTH, 彼得

相关问题