4

我有一个要上传到 Web 服务的文件,但它需要额外的参数,所以我创建了一些带有关联名称的隐藏字段:值对以推送到服务器请求。但问题是服务的定义。

[错误]

合同“IFormServices”中的操作“NewImage”有多个请求主体参数,其中一个是 Stream。当 Stream 为参数时,body 中不能有其他参数。

[界面]

[OperationContract]
    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Json)]
    string NewImage(Stream data, string server,string datasource, string document, string image_id);

[定义]

public string NewImage(Stream data, string server, string datasource, string document, string image_id)
        {
        //this should, similar to others, need a server, datasource, and some sort of document in which to append the images.
        WebClient wsb = new WebClient();
        string str = "_URL_";
        byte[] byte_data = new byte[data.Length];
        data.Read(byte_data, 0, byte_data.Length);
        byte[] response = wsb.UploadData(str,"POST",byte_data);
        string retVal = Convert.ToString(response);
        //want to return a JSON.serialized dictionary of:  given image_id + id returned from response.
        Dictionary<string, object> retDict = new Dictionary<string, object>();
        retDict["filename"] = image_id;
        retDict["id"] = "";
        //return new JavaScriptSerializer().Serialize(json);
        return "-1";
        }

[javascript代码]

var $form = $("<form />").attr({
                method: "POST",
                enctype: "multipart/form-data",
                target: "image_processing",
                action: "webservices/FormServices.svc/NewImage",
                id: "push_image_to_server"
            } ).appendTo( "body" );
            var im_id = $( this ).attr( "image_id" );
            $( this ).appendTo( "form#push_image_to_server" );
            $( "<input type='hidden' />" ).attr( { name: "server", value: BASE_URL } ).appendTo( $form );
            $( "<input type='hidden' />" ).attr( { name: "datasource", value: SELECTED_DATASOURCE } ).appendTo( $form );
            $( "<input type='hidden' />" ).attr( { name: "document", value: SELECTED_DOCUMENT } ).appendTo( $form );
            $( "<input type='hidden' />" ).attr( { name: "image_id", value: im_id } ).appendTo( $form );
            $("iframe#image_processing").bind("load", function (a,b,c) {
                console.log("SUCCESS", arguments);
                $( "iframe#image_processing" ).unbind( "load", function (a,b,c)
                {
                    console.log( arguments );
                    _IMAGE_UPLOADS_[a["filename"]] = a["id"];
                } );
                $( "form#push_image_to_server" ).remove();
            } );

所以我试图找出一种方法将 4 个字符串 + 一个文件发送到服务器。

这将如何完成?

编辑:将错误代码放在顶部。

4

6 回答 6

2

这篇文章:如何:使用 WCF REST 编程模型创建接受任意数据的服务描述了另一种将流与一些数据一起发布的方法。

它们展示了如何随文件一起发送文件名(但您可以添加和/或用任何字符串参数替换它)。

合同是:

[ServiceContract]
public interface IReceiveData
{
    [WebInvoke(UriTemplate = "UploadFile/{strParam1}/{strParam2}")]
    void UploadFile(string strParam1, string strParam2, Stream fileContents);
}

公开的服务将通过 POST 接受流以及定义的参数。

于 2015-05-04T06:22:09.080 回答
1

这是 WCF 的一个问题\错误,它在使用 Stream 输入时不接受任何其他参数。

WCF 也有类似的问题,经过所有研究,我们决定将其他输入参数也转换为流,并使用一些分隔符将其附加到输入

于 2013-11-01T16:19:47.373 回答
1

只是一个想法 - 使用 HTTP 标头怎么样?然后,您可以使用WebOperationContext.IncomingRequest.

于 2013-11-01T17:04:01.413 回答
1

当您发送流时,它实际上会发送请求中的所有内容。我这样做是为了获取数据:

public string NewImage(Stream data){
    NameValueCollection PostParameters = HttpUtility.ParseQueryString(new StreamReader(data).ReadToEnd());
    string server = PostParameters["server"],
    string datasource = PostParameters["datasource"], 
    string document = PostParameters["document"];
    string image_id = PostParameters["image_id"];
    var img = PostParameters["File"];

    //do other processing...
}
于 2013-11-13T20:23:17.413 回答
1

怎么用HttpRequest.QueryString[]

[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "NewImage")]
string NewImage(Stream data);

您可以通过以下 URL 调用它:

\NewImage?server={server}&datasource={datasource}&document={doc}&image_id={id}

然后在您的代码中:

public string NewImage(Stream imgStream)
{
    var request = System.Web.HttpContext.Current.Request;

    var server= request.QueryString["server"];
    var datasource = request.QueryString["datasource"];
    var document= request.QueryString["document"];
    var image_id= request.QueryString["image_id"];

    ...
}

我一直在寻找类似的东西,今天偶然发现了它。

于 2017-03-29T03:58:52.920 回答
0

如果string您的方法的结果参数NewImage是某种唯一标识符,您可以创建第二个方法,称为类似的方法NewImageAttributes,它接受额外数据以及唯一标识符,然后您可以在服务中再次将数据绑定在一起。

当然,这意味着对服务的两次调用,但它可能会解决您的问题。

于 2013-11-01T16:22:17.987 回答