簡體   English   中英

將文件從Android上傳到Azure中的WCF

[英]Upload a file from Android to WCF in Azure

我正在嘗試將文件從android上傳到azure,這讓我發瘋。 我認為設置中有一些東西,因為我已經確認代碼可以在IIS中使用android。 現在,我可以在C#中訪問該方法,但是服務器上的流為空。 在android中,我收到415錯誤“類型不匹配”。 任何幫助,萬分感謝!

這是我的C#測試客戶端:

            ServiceReference1.PostImage2Request r = new ServiceReference1.PostImage2Request();
            MemoryStream memStream = new MemoryStream();                 
            using (FileStream fileStream = File.OpenRead("C:\\crap.png"))
            {
                memStream.SetLength(fileStream.Length);
                fileStream.Read(memStream.GetBuffer(), 0, (int)fileStream.Length);
            }
            r.image = memStream;
            ServiceReference1.RestServiceImplClient c = new ServiceReference1.RestServiceImplClient();
            ServiceReference1.PostImage2Response p = c.PostImage2(r);

這是我的客戶端配置:

 <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IRestServiceImpl" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://testapp.cloudapp.net/Service1.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRestServiceImpl"
    contract="ServiceReference1.IRestServiceImpl" name="BasicHttpBinding_IRestServiceImpl" />
</client>

這是我的android代碼:

    String url = "https://testapp.cloudapp.net/Service1.svc/postimage2"; 

        String filepath = String.format(Environment.getExternalStorageDirectory() + "/ImageStorage/1.jpg");

        File f = new File(filepath);

        if (f.exists())
        {
            DefaultHttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost(url);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();

            //This is the new shit to deal with MIME
            MultipartEntity entity = new MultipartEntity();
            entity.addPart("image", new FileBody(f, "multipart/form-data"));

            httppost.setEntity(entity);

            try {
                String responseString = httpclient.execute(httppost, responseHandler);

這是我的服務器代碼:

    [OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "PostImage2")]
    string PostImage2(Stream image);

     public string PostImage2(Stream image)
    {
        MultipartParser parser = new MultipartParser(image);

        string content = "testing123";
        try
        {

            if (image == null)
                return "Image stream is null";

            // Read the stream into a byte array
            byte[] data = parser.ToByteArray(image);

            // Copy to a string for header parsing
            content = Encoding.UTF8.GetString(data);

            if (content == "")
                content = "There is no content";

            return content + " - dataLength: " + data.Length.ToString();
        }
        catch (Exception ex)
        {
            return "ERROR" + ex.Message + ex.InnerException + ex.StackTrace;
        }


    }

這是我的服務器配置:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior name="WCFServiceWebRole2.Service1Behavior">
      <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_WCFServiceWebRole2" transferMode="Streamed" maxBufferSize="10485760" maxReceivedMessageSize="67108864">
      <readerQuotas maxDepth="64" maxStringContentLength="214748364" maxArrayLength="214748364"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service name="WCFServiceWebRole2.Service1" behaviorConfiguration="WCFServiceWebRole2.Service1Behavior">        
    <endpoint address="" binding="basicHttpBinding" contract="WCFServiceWebRole2.IRestServiceImpl"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>

您使用分段格式有什么特殊原因嗎? 通常這樣做是因為您要在一個請求中發送多個內容。 例如,一個文件和一些關聯的數據,或幾個文件等。您似乎並沒有這樣做,所以多部分格式設置只會使問題變得混亂。 除非您有充分理由進行多部分格式化,否則我將完全刪除它。 讓您的客戶端發送原始字節,讓服務器代碼直接從流中讀取,而無需使用MultipartParser

另外,我注意到一旦獲得圖像數據,您將嘗試將其讀取為UTF8數據。 我可以肯定地說這是行不通的,而且可能不是

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM