For a request in an operation, UploadPhotoStream will be a stream, the operation must have a single parameter, the type of which is Stream

I searched for this problem but could not find the exact solution.

Code:

namespace StackSample.Logic { [ServiceHeaderBehavior] [MerchantHeaderBehavior] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Merchant : Interfaces.IMerchant { public bool UploadPhotoStream(string productid, string photoid, Stream fileData) { Logic.Components.Product ca = new Logic.Components.Product(); return ca.UploadPhotoStream(Common.UserValues().Merchant, productid, photoid, fileData); } } } namespace StackSample.Interfaces { [ServiceContract] public interface IMerchant { [OperationContract] [WebInvoke(UriTemplate = "UploadPhotoStream?productid={productid}&photoid={photoid}", Method = "POST")] bool UploadPhotoStream(string productid, string photoid, Stream fileData); } } 

Configuration:

 <bindings> <basicHttpBinding> <binding name="SOAPSecure"> <security mode="None" /> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2097152" maxBytesPerRead="4096" maxNameTableCharCount="2097152" /> </binding> <binding name="SOAPSecureTransfer" transferMode="Streamed" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:15:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> </security> </binding> </basicHttpBinding> <webHttpBinding> <binding name="RESTSecure"> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> </security> </binding> <binding name="RESTSecureTransfer" transferMode="Streamed" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:15:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" useDefaultWebProxy="true"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> </security> </binding> </webHttpBinding> </bindings> <!-- behaviors --> <behaviors> <endpointBehaviors> <behavior name="JSON"> <webHttp defaultOutgoingResponseFormat="Json" /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="Default"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> <services> <service behaviorConfiguration="Default" name="StackSample.Logic.Merchant"> <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="SOAPSecureTransfer" contract="StackSample.Interfaces.IMerchant" /> <endpoint address="rest" behaviorConfiguration="JSON" binding="webHttpBinding" bindingConfiguration="RESTSecureTransfer" contract="StackSample.Interfaces.IMerchant" /> </service> </services> 

When I try to run http://localhost:64039/Merchant/Merchant.svc
It shows an error:

 For request in operation UploadPhotoStream to be a stream the operation must have a single parameter whose type is Stream. 

I do not know what to do.

+5
source share
3 answers

For future viewers, if you want to achieve this goal, in which you can add several parameters along with Stream , you need to avoid using SVC files to create a Rest or Soap service. Instead, add this to your services project, Global.asax file, the make route table, for example, for example:

 public class Global : System.Web.HttpApplication { RouteTable.Routes.Add(new ServiceRoute("MyApp/rest/Photo", new WebServiceHostFactory(), typeof(PhotoComponent))); } 

In your web service:

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class PhotoComponent : Interfaces.IPhotoComponent { public bool UploadPhotoStream(string productid, string photoid, Stream fileData) { // some code.... } } [ServiceContract] public interface PhotoComponent { [OperationContract] [WebInvoke(UriTemplate = "UploadPhotoStream/{productid}/{photoid}", Method = "POST")] bool UploadPhotoStream(string productid, string photoid, System.IO.Stream fileData); } 

inside web.config:

 <services> <service behaviorConfiguration="Default" name="StackSample.Logic.PhotoComponent"> <endpoint behaviorConfiguration="JSON" binding="webHttpBinding" bindingConfiguration="RESTSecureTransfer" contract="StackSample.Interfaces.PhotoComponent" /> </service> </services> 

and name it:

 https://127.0.0.1/MyApp/rest/Photo/UploadPhotoStream/{productid}/{photoid} 

Hope this helps.

+5
source

Your operation should have one parameter that takes an object containing the properties you need.

For example, see the code below:

 public interface IMerchant { bool UploadPhotoStream(UploadData request); } public class YourService : IMerchant { public bool UploadPhotoStream(UploadData request) { throw new NotImplementedException(); } } [DataContract] public class UploadData { [DataMember] string ProductId { get; set; } [DataMember] string PhotoId { get; set; } [DataMember] System.IO.Stream FileData { get; set; } } 
+4
source

You must configure the service as follows in the web.config file. Then you can send Stream with additional URL parameters. The Stream parameter must be the last parmater in the function.

  <system.serviceModel> <services> <service behaviorConfiguration="ServiceBehavior" name="YourServiceClassWithNamespace"> <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJSON" contract="YourServiceInterfaceWithNamespace" behaviorConfiguration="EndpointBehavior" /> </service> </services> <bindings> <webHttpBinding> <binding name="webHttpBindingWithJSON" crossDomainScriptAccessEnabled="true" maxReceivedMessageSize="67108864" openTimeout="00:10:00" closeTimeout="00:10:00" sendTimeout="00:10:00" receiveTimeout="00:10:00"> </binding> </webHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="EndpointBehavior"> <webHttp/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="ServiceBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> 
0
source

All Articles