2009-10-20 40 views
0

我正在设计一个多文件上传服务,它还显示每个文件的上传 进度。使用类型列表调用客户端WCF服务<Of T>

如果我来设计我的WCF方法作为SOAP的合同,我会做 是这样的:

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

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

帮助表示感谢,谢谢。

回答

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); 

马克

+0

马克 - 我的反应是在上述(或低于) “接听”。谢谢你的想法。 – 2009-10-20 14:06:02

0

谢谢您的回答。

我对我的API的一部分使用SOAP,但我也使用webhttp端点 进行REST风格的xhr调用和JSON响应。我已经能够在节目中做到这一点 别处:

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

我试图做同样的事情对我的上传服务,但是,正如你所指出 出来,收集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重定义格式的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整数类型的支撑类 - 东西像:

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的类来执行此操作,但在Internet上有大量示例。您可以先查找
“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, 彼得

+0

你应该编辑你的原始问题并且扩展它/澄清它,而不是添加你自己的答案 – 2009-10-20 16:24:06

相关问题