使用datacontract将图像与用户ID一起上传到wcf服务

时间:2017-03-08 15:41:41

标签: c# wcf datacontract messagecontract operationcontract

我想使用post,datacontract将图像从javascript上传到wcf服务。 我在google中读过,使用datacontract它是不可能的,它可以用消息契约来完成,因为当一个参数是流时,它不应该有任何其他参数。

但是在某些链接中提到它可以通过在querystring中传递参数来完成。 (例如:WCF Restful service file upload with multi-platform support) 我试过,仍然得到错误说如果流作为参数,它不应该包含任何其他参数。 但即使使用查询字符串也不可能? 以下是我的代码

 [OperationContract]
    [WebInvoke(Method = "POST",UriTemplate = "/UploadFile/userId={userId}", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    void UploadFile(string userId,Stream uploadingDetails);

1 个答案:

答案 0 :(得分:0)

Stream参数应该是您的操作合同中的最后一个参数。如果您使用v3.5或4.0,您将看到该错误。但你可以忽略它。或者你可以试着这样做:

[DataContract]
public class UploadData
{
    [DataMember]
    string userId { get; set; }

    [DataMember]
    Stream uploadingDetails { get; set; }
}

public class YourService : IYourService
{

    public bool  UploadFile(UploadData request)
    {
    }
}

或者您在使用Stream时还有一个选项,只是尽量避免在ur url中使用.svc。添加以下代码:

public class Global : System.Web.HttpApplication
{
    RouteTable.Routes.Add(new ServiceRoute("yourApp/yourService/upload", new WebServiceHostFactory(), typeof(YourService)));
} 

并将以下属性装饰到您的服务中:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

并按以下方式致电您的服务:

http://localhost:123456/yourApp/yourService/upload/{userId}