C# 将图像上载到WCF服务会减小图像大小,并且图像未打开

C# 将图像上载到WCF服务会减小图像大小,并且图像未打开,c#,asp.net,image,wcf,file-upload,C#,Asp.net,Image,Wcf,File Upload,我正在尝试使用WCF服务上载图像和其他文件,图像和其他类型的文件正在成功上载。但我面临的问题是,当我上传几KB的图片时,它会被上传,并且我能够很好地打开它。但当图像大小很大时,就像我试图上传800KB的图像一样,只上传了10KB的图像,而且图像无法打开,或者图像已损坏 我的web.config如下所示: <?xml version="1.0"?> <configuration> <appSettings> </appSettings>

我正在尝试使用WCF服务上载图像和其他文件,图像和其他类型的文件正在成功上载。但我面临的问题是,当我上传几KB的图片时,它会被上传,并且我能够很好地打开它。但当图像大小很大时,就像我试图上传800KB的图像一样,只上传了10KB的图像,而且图像无法打开,或者图像已损坏

我的web.config如下所示:

<?xml version="1.0"?>
<configuration>

  <appSettings>

  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="2097151" targetFramework="4.0"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"    />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service
          name="ImageUploadingService.Service1"
          behaviorConfiguration="MyServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="ImageUploadingService.IService1" behaviorConfiguration="web" />

      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding
          maxBufferPoolSize="2147483647000000"
          maxReceivedMessageSize="2147483647000000"
          maxBufferSize="2147483647" transferMode="StreamedRequest">
        </binding>
      </webHttpBinding>
    </bindings>

  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostImage?fileName={fileName}&Ext={Ext}&Path={Path}", Method = "POST")]
    string PostImage(Stream sm,string fileName,string Ext,string Path);
}
public class Service1 : IService1
{
    public string PostImage(Stream stream, string fileName, string Ext, string Path)
    {
        byte[] buffer = new byte[10000];
        stream.Read(buffer, 0, 10000);
        FileStream f = new FileStream(Path+fileName   , FileMode.OpenOrCreate);
        f.Write(buffer, 0, buffer.Length);
        f.Close();
        stream.Close();
        return "Recieved the image on server";
    }
}
protected void btnUploadImage_Click(object sender, EventArgs e)
{
    PostData();
}
public void PostData()
{   
    string FileName="";
    string ext="";
    try
    {
        byte[] fileToSend = null; 

        if (FileUpload1.HasFile)
        {
            ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
            FileName = FileUpload1.FileName;
            Stream stream = FileUpload1.FileContent;
            stream.Seek(0, SeekOrigin.Begin);
            fileToSend = new byte[stream.Length];
            int count = 0;
            while (count < stream.Length)
            {
                fileToSend[count++] = Convert.ToByte(stream.ReadByte());
            }
        }

        //Here provide your service location url in below line. You need to host your service on server(IIS or which one you prefer)
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:49287/Service1.svc/PostImage?fileName="+FileName+"&Ext="+ ext +"&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\");//PostImage?fileName={fileName}&Ext={Ext}&Path={Path}

        req.Method = "POST";
        req.ContentType = "application/octet-stream"; 
        req.ContentLength = fileToSend.Length;
        Stream reqStream = req.GetRequestStream();
        reqStream.Write(fileToSend, 0, fileToSend.Length);
        reqStream.Close();

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        StreamReader reader = new StreamReader(resp.GetResponseStream());
        string result = reader.ReadToEnd();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
我的服务课是这样的:

<?xml version="1.0"?>
<configuration>

  <appSettings>

  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="2097151" targetFramework="4.0"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"    />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service
          name="ImageUploadingService.Service1"
          behaviorConfiguration="MyServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="ImageUploadingService.IService1" behaviorConfiguration="web" />

      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding
          maxBufferPoolSize="2147483647000000"
          maxReceivedMessageSize="2147483647000000"
          maxBufferSize="2147483647" transferMode="StreamedRequest">
        </binding>
      </webHttpBinding>
    </bindings>

  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostImage?fileName={fileName}&Ext={Ext}&Path={Path}", Method = "POST")]
    string PostImage(Stream sm,string fileName,string Ext,string Path);
}
public class Service1 : IService1
{
    public string PostImage(Stream stream, string fileName, string Ext, string Path)
    {
        byte[] buffer = new byte[10000];
        stream.Read(buffer, 0, 10000);
        FileStream f = new FileStream(Path+fileName   , FileMode.OpenOrCreate);
        f.Write(buffer, 0, buffer.Length);
        f.Close();
        stream.Close();
        return "Recieved the image on server";
    }
}
protected void btnUploadImage_Click(object sender, EventArgs e)
{
    PostData();
}
public void PostData()
{   
    string FileName="";
    string ext="";
    try
    {
        byte[] fileToSend = null; 

        if (FileUpload1.HasFile)
        {
            ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
            FileName = FileUpload1.FileName;
            Stream stream = FileUpload1.FileContent;
            stream.Seek(0, SeekOrigin.Begin);
            fileToSend = new byte[stream.Length];
            int count = 0;
            while (count < stream.Length)
            {
                fileToSend[count++] = Convert.ToByte(stream.ReadByte());
            }
        }

        //Here provide your service location url in below line. You need to host your service on server(IIS or which one you prefer)
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:49287/Service1.svc/PostImage?fileName="+FileName+"&Ext="+ ext +"&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\");//PostImage?fileName={fileName}&Ext={Ext}&Path={Path}

        req.Method = "POST";
        req.ContentType = "application/octet-stream"; 
        req.ContentLength = fileToSend.Length;
        Stream reqStream = req.GetRequestStream();
        reqStream.Write(fileToSend, 0, fileToSend.Length);
        reqStream.Close();

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        StreamReader reader = new StreamReader(resp.GetResponseStream());
        string result = reader.ReadToEnd();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
我要上传的代码如下:

<?xml version="1.0"?>
<configuration>

  <appSettings>

  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="2097151" targetFramework="4.0"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"    />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service
          name="ImageUploadingService.Service1"
          behaviorConfiguration="MyServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="ImageUploadingService.IService1" behaviorConfiguration="web" />

      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <binding
          maxBufferPoolSize="2147483647000000"
          maxReceivedMessageSize="2147483647000000"
          maxBufferSize="2147483647" transferMode="StreamedRequest">
        </binding>
      </webHttpBinding>
    </bindings>

  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostImage?fileName={fileName}&Ext={Ext}&Path={Path}", Method = "POST")]
    string PostImage(Stream sm,string fileName,string Ext,string Path);
}
public class Service1 : IService1
{
    public string PostImage(Stream stream, string fileName, string Ext, string Path)
    {
        byte[] buffer = new byte[10000];
        stream.Read(buffer, 0, 10000);
        FileStream f = new FileStream(Path+fileName   , FileMode.OpenOrCreate);
        f.Write(buffer, 0, buffer.Length);
        f.Close();
        stream.Close();
        return "Recieved the image on server";
    }
}
protected void btnUploadImage_Click(object sender, EventArgs e)
{
    PostData();
}
public void PostData()
{   
    string FileName="";
    string ext="";
    try
    {
        byte[] fileToSend = null; 

        if (FileUpload1.HasFile)
        {
            ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
            FileName = FileUpload1.FileName;
            Stream stream = FileUpload1.FileContent;
            stream.Seek(0, SeekOrigin.Begin);
            fileToSend = new byte[stream.Length];
            int count = 0;
            while (count < stream.Length)
            {
                fileToSend[count++] = Convert.ToByte(stream.ReadByte());
            }
        }

        //Here provide your service location url in below line. You need to host your service on server(IIS or which one you prefer)
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:49287/Service1.svc/PostImage?fileName="+FileName+"&Ext="+ ext +"&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\");//PostImage?fileName={fileName}&Ext={Ext}&Path={Path}

        req.Method = "POST";
        req.ContentType = "application/octet-stream"; 
        req.ContentLength = fileToSend.Length;
        Stream reqStream = req.GetRequestStream();
        reqStream.Write(fileToSend, 0, fileToSend.Length);
        reqStream.Close();

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        StreamReader reader = new StreamReader(resp.GetResponseStream());
        string result = reader.ReadToEnd();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
protectedvoid btnUploadImage\u单击(对象发送方,事件参数e)
{
PostData();
}
public void PostData()
{   
字符串FileName=“”;
字符串ext=“”;
尝试
{
字节[]fileToSend=null;
if(FileUpload1.HasFile)
{
ext=System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
FileName=FileUpload1.FileName;
Stream=文件上传1.FileContent;
stream.Seek(0,SeekOrigin.Begin);
fileToSend=新字节[stream.Length];
整数计数=0;
while(计数<流长度)
{
fileToSend[count++]=Convert.ToByte(stream.ReadByte());
}
}
//在下面的行中提供您的服务位置url。您需要在服务器(IIS或您喜欢的服务器)上托管您的服务
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(“http://localhost:49287/Service1.svc/PostImage?fileName=“+FileName+”&Ext=“+Ext+”&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\”;//PostImage?FileName={FileName}&Ext={Ext}&Path={Path}”
请求方法=“POST”;
req.ContentType=“应用程序/八位字节流”;
req.ContentLength=fileToSend.Length;
Stream reqStream=req.GetRequestStream();
请求流写入(fileToSend,0,fileToSend.Length);
reqStream.Close();
HttpWebResponse resp=(HttpWebResponse)req.GetResponse();
StreamReader=新的StreamReader(resp.GetResponseStream());
字符串结果=reader.ReadToEnd();
}
捕获(例外情况除外)
{
掷骰子;
}
}

任何类型的建议都将不胜感激。

您的服务代码包含以下行:

    byte[] buffer = new byte[10000];
    stream.Read(buffer, 0, 10000);
你说的是大约10KB

尝试将服务方法更改为以下内容:

    FileStream f = new FileStream(Path+fileName   , FileMode.OpenOrCreate);
    stream.CopyTo(f);
    f.Close();
    stream.Close();

非常感谢@Igor..工作顺利..但当我选择超过20mb的文件时页面崩溃…请提供任何建议。我打赌你可能会遇到一些超时。据我所知,您会遇到一些异常(您必须尝试/捕获代码)。你能把你遇到的例外情况发出来吗?这样我就能更好地告诉你如何处理它了。