WCF服务应用程序:该操作必须具有单个参数,其类型为Stream

可能重复:
WCF Rest Webservice with stream

我正在使用C#开发WCF .NET Framework 4.0。

我用这个Visual Studio模板创建了这个WCF:

在此处输入图像描述

我需要发送带有两个或三个参数的图像。 这是我所有的OperationContract (我要求最后一个):

 [ServiceContract] public interface IRestServiceImpl { [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "orders/")] OrderContract[] allOrders(); [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "filteredOrders/")] OrderContract[] GetOrders(IdsMessage msg); [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "completeFilteredOrders/")] OrderContract[] LoadCompleteFilteredOrders(IdsMessage msg); [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "saveEReports/")] Boolean SaveEReports(EReportContract[] eReports); [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "saveEReport/")] long SaveEReport(EReportContract eReport); [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "UploadPhoto/{eReportId}/{imageType}")] Boolean UploadPhoto(string eReportId, string imageType, Stream fileContents); } 

这是Web.config

                                      

当我运行服务时,我得到以下exception:

该操作必须具有单个参数,其类型为Stream

如果我这样做:

 [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "UploadPhoto")] Boolean UploadPhoto(Stream fileContents); 

它工作得很好,但我需要发送更多数据与图像。

此服务适用于Android平板电脑应用程序。 以下代码显示了我现在如何将图像发送到服务器:

 public static Boolean sendImage(String url, String filePath) { try { MultiValueMap formData; Resource resource = new FileSystemResource(filePath); // populate the data to post formData = new LinkedMultiValueMap(); formData.add(OrderSpringController.FILE, resource); HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json"))); // Sending multipart/form-data requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); // Populate the MultiValueMap being serialized and headers in an HttpEntity object to use for the request HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(formData, requestHeaders); GsonHttpMessageConverter messageConverter = new GsonHttpMessageConverter(); List<HttpMessageConverter> messageConverters = new ArrayList<HttpMessageConverter>(); messageConverters.add(messageConverter); // Create a new RestTemplate instance RestTemplate restTemplate = new RestTemplate(true); restTemplate.getMessageConverters().add(messageConverter); // Make the network request, posting the message, expecting a String in response from the server ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, Boolean.class); // Return the response body to display to the user return response.getBody(); } catch (Exception ex) { ex.printStackTrace(); } return null; } 

浏览到元数据端点( http:// localhost:2351 / RestServiceImpl.svc )时发生错误。

如何发送图像和参数?

如果切换到(BasicHttp或WSHttp)Binding,那么您可以通过组合单个数据类型来实现您的目标,包括通过属性和Stream对象本身的所有自定义参数。 然后,您将使用消息传递样式而不是RPC对话。 并请注意[MessageContract]系列的WCF DTO装饰器。

 [ServiceContract] public interface ITransferService { [OperationContract] RemoteFileInfo DownloadFile(DownloadRequest request); [OperationContract] void UploadFile(RemoteFileInfo request); } [MessageContract] public class DownloadRequest { [MessageBodyMember] public string FileName; } [MessageContract] public class RemoteFileInfo : IDisposable { [MessageHeader(MustUnderstand = true)] public string FileName; [MessageHeader(MustUnderstand = true)] public long Length; [MessageBodyMember] public System.IO.Stream FileByteStream; public void Dispose() { if (FileByteStream != null) { FileByteStream.Close(); FileByteStream = null; } } 

}

这有必要的代码http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP

但我强烈建议WCF:使用消息合约流媒体和http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/25/wcf-streaming-inside-data-contracts.aspx

这是必须的,以及:)

尝试重新排序您的参数,以便Stream是最后一个。

还看看这里

我已经创建了新类型并将其selalize

它包含3个值(stream,reportid,reporttype)

下面是代码

 namespace WcfService5 { [ServiceContract] public interface IService1 { [OperationContract] Boolean UploadPhoto(data fileContents); } [Serializable] public struct data { System.IO.Stream mystream; string ereport; string reporttype; } } 

这是服务代码

 public class Service1 : IService1 { public bool UploadPhoto( data value) { return false; } }