我正在使用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
:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="EReportService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">
<endpoint address="" binding="webHttpBinding" contract="EReportService.IRestServiceImpl" behaviorConfiguration="web">
</endpoint>
</service>
</services>
<bindings>
<webHttpBinding>
<binding maxReceivedMessageSize="2097152" maxBufferSize="2097152" transferMode="Streamed"/>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<connectionStrings>
</connectionStrings>
</configuration>
当我运行服务时,我得到以下异常:
操作必须有一个类型为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<String, Object> formData;
Resource resource = new FileSystemResource(filePath);
// populate the data to post
formData = new LinkedMultiValueMap<String, Object>();
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<String, Object>> requestEntity =
new HttpEntity<MultiValueMap<String, Object>>(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<Boolean> 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)时会发生错误。
如何发送图片和参数?
答案 0 :(得分:5)
如果切换到(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: using streaming with Message Contracts和http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/25/wcf-streaming-inside-data-contracts.aspx
This也是必须的:)
答案 1 :(得分:1)
尝试重新排序您的参数,以便Stream是最后一个。
还要看here
答案 2 :(得分:1)
我创建了新类型并将其选中
它包含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;
}
}