通过JSON将流和参数解析为WCF操作契约

时间:2011-11-03 17:54:27

标签: .net wcf stream

我必须调用WCF服务来转换图像。由于图像是流(可能很大),我想要一种方法,我可以将流和一对参数(图像转换信息)发送到方法。如何定义操作合同的方法签名?请注意,我正在进行JSON调用并使用Http post方法发送图像。所以我没有创建.net代理的奢侈 如何调用以下WCF方法?或者有更好的方法来做到这一点? 例如。

        [OperationContract]
        [WebInvoke(UriTemplate = "/MyOperation", Method = "POST", RequestFormat = WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
Public CompositeType1 MyOperation(Stream image,CompositeType2 param){

}

4 个答案:

答案 0 :(得分:2)

Rajesh回答不正确 您可以使用Stream

获得其他参数

试试这个:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/{pram1}/{pram2}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
string ProcessData(string pram1, string pram2, Stream zipFile);

请查看此链接WCF UriTemplate and POST data on msdn

答案 1 :(得分:0)

首先,当您将Stream作为参数之一时,您无法使用其他参数来更改您的方法,如下所示:

[WebInvoke]
public CompositeType1 MyOperation(Stream image)
{}

现在为了将图像和复合类型对象传递给该方法是可以实现的,但是您需要将请求作为多部分表单数据发布。当您将请求作为多部分表单数据发布时,您需要在服务器端使用解析器来解析流,以便为您提取适当的内容,即从流中提取图像和复合类型对象。已有一个现有的多部分表单解析器供您下载,但您必须自定义它以满足您的要求。我认为这是一项复杂的任务。多部分表单解析的链接是here

可以找到有关多部分表单数据的一些信息here

我想最简单的方法是将操作中的图像上传分开并单独使用。

答案 2 :(得分:0)

使用此代码:

ServiceContract]
    public interface IRestServiceImpl
    {
        [OperationContract]
        [System.ServiceModel.Web.WebInvoke(Method = "GET",ResponseFormat=System.ServiceModel.Web.WebMessageFormat.Xml, BodyStyle =System.ServiceModel.Web.WebMessageBodyStyle.Wrapped, UriTemplate = "xml/{id}")]
        string XMLData(string id);
        [OperationContract]
        [System.ServiceModel.Web.WebInvoke(Method = "GET", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json, BodyStyle = System.ServiceModel.Web.WebMessageBodyStyle.Wrapped, UriTemplate = "json/{id}")]
        string JSONData(string id);
    }




public class RestServiceImpl : IRestServiceImpl
    {
        #region IRestService Members
        public string XMLData(string id)
        {
            return "You Request Porduct" + ":"+id;

        }
        public string JSONData(string id)
        {
            return "Yor Request Product" +":"+ id;
        }
        #endregion
    }

答案 3 :(得分:0)

也许您可以使用一个小技巧。您可以使用参数byte []代替流,然后使用以下代码将其转换为流:
Stream stream = new MemoryStream(yourByteArray);