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