2010-08-04 73 views
4

我必須發送文件到我的webservice,但webservice假定文件(byte Array)爲base64Binary。在Java中編碼base64並在C#中解碼

編碼之前,byteArrayFile作爲常規文件保存在磁盤上。 (我這樣做只是爲了測試)

所以,在我的Java客戶端,web服務,我送的信息是這樣的:

String file = new sun.misc.BASE64Encoder().encode(byteArrayFile); 
port.sendFileToWebService(file); 

的Web服務已經解碼的信息,並保存接收磁盤上的文件。

[WebMethod] 
    public string sendFileToWebService(string file) 
    { 

     string dirname = HttpContext.Current.Request.PhysicalApplicationPath + "\\Attachments\\"; 
     if (!System.IO.Directory.Exists(dirname)) 
     { 
      System.IO.Directory.CreateDirectory(dirname); 
     } 
     string filename = dirname + "/" + "file.sim"; 
     WebClient myWebClient = new WebClient(); 
     myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
     byte[] byteArray = null; 

     byteArray = Convert.FromBase64String(file.Replace("\n", "")); 

     byte[] responseArray = myWebClient.UploadData(filename, "POST", byteArray); 
     return "Webservice says OK"; 
    } 

的問題是:

保存在磁盤上的文件(在編碼之前)和文件用C#解碼不等於。 我不知道這是Java編碼還是C#解碼的問題。

任何建議,包括更改文件類型或邏輯過程,都將不勝感激。

在此先感謝!

編輯 - 文件比較:

Original File http://img819.imageshack.us/img819/820/originalu.png

Decoded File (after Java encoding) http://img826.imageshack.us/img826/3184/processed.png

+0

原始文件被保存在我的本地磁盤上。另一個文件發送給Webservice,將文件保存在服務器磁盤上。我可以訪問這兩個位置並使用Notepad ++打開文件,並確認兩個文件的大小和內容都不相同。 – CalypsOOO 2010-08-04 22:23:24

+0

你爲什麼在你的C#代碼中使用WebClient? – nos 2010-08-04 22:26:19

+0

我不確定...我從論壇中獲取此代碼。 – CalypsOOO 2010-08-04 22:37:29

回答

2

我知道XSD標準規定稱爲base64Binary的數據類型。這應該允許的是,您的[WebMethod]參數是byte[]。然後底層服務棧會將字節數組編碼爲base64字符串。

舉例來說,我只是做了一個快速的Java服務這樣

@WebMethod(operationName = "TestByteArray") 
    public void testByteArray(byte[] data) { 

    } 

和生成的WSDL這個樣子的相關部分:

<operation name="TestByteArray"> 
    <input wsam:Action="jordan.services/EncodingTests/TestByteArrayRequest" message="tns:TestByteArray"/> 
    <output wsam:Action="jordan.services/EncodingTests/TestByteArrayResponse" message="tns:TestByteArrayResponse"/> 
</operation> 

而且

<xs:complexType name="TestByteArray"> 
    <xs:sequence> 
     <xs:element name="arg0" type="xs:base64Binary" nillable="true" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

我也做了一個測試。網:

[WebMethod] 
public void testByteArray(byte[] bytes) { 
} 

生成的WSDL的相關部分:

<wsdl:portType name="TestWSSoap"> 
    <wsdl:operation name="testByteArray"> 
     <wsdl:input message="tns:testByteArraySoapIn"/> 
     <wsdl:output message="tns:testByteArraySoapOut"/> 
    </wsdl:operation> 
</wsdl:portType> 

而且

<wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> 
     <s:element name="testByteArray"> 
      <s:complexType> 
       <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" name="bytes" type="s:base64Binary"/> 
       </s:sequence> 
      </s:complexType> 
     </s:element> 
     <s:element name="testByteArrayResponse"> 
      <s:complexType/> 
     </s:element> 
    </s:schema> 
</wsdl:types> 
+0

謝謝。非常有用的評論。 我的問題是關於在Java和C#之間的base64編碼和解碼# – CalypsOOO 2010-08-04 23:32:50

+1

@CalypsOOO - 對,我的建議是,你不需要做WS調用之前/之後的base64編碼。只需發送原始字節數組。當你用c#接收它時,只需發佈​​字節數組(或直接寫出)。如果你之前編碼過,那麼你在發送一個xsd:string而不是xsd:base64Binary,就像你在問題的第一句中提到的一樣。 – 2010-08-05 00:04:26

+0

嗯,好吧。對不起,我沒有理解你的建議。 您之前是否已經測試過它?我以爲base64Binary是一個字符串,因爲編碼任何東西base64Binary返回一個字符串。 類似的問題在這裏:http://stackoverflow.com/questions/2551525/failed-sending-bytes-array-to-jax-ws-web-service-on-axis – CalypsOOO 2010-08-05 01:16:14

-3

我可能錯了位,我認爲你需要將文件轉換爲字符串格式正確的base64相互轉換。

不知道這是必需的,但在JavaScript中你必須首先投射字符串,然後轉換爲base64。

+0

不理解負面投票,只是試圖幫助。 :S – Ecarrion 2010-08-04 22:27:23

+0

是的,這裏有很多愚蠢的白癡...... – Sylar 2010-08-05 07:09:17

+0

你曾經期待過一次投票嗎?你不認爲這會打敗投票的目的嗎? – bzlm 2010-08-05 07:51:40

1

嘗試使用正常的文件/的輸入輸出,而不是Web客戶端

public string sendFileToWebService(string file) 
{ 

    string dirname = HttpContext.Current.Request.PhysicalApplicationPath + "\\Attachments\\"; 
    if (!System.IO.Directory.Exists(dirname)) 
    { 
     System.IO.Directory.CreateDirectory(dirname); 
    } 
    string filename = dirname + "/" + "file.sim"; 
    byte[] byteArray = Convert.FromBase64String(file); 
    File.WriteAllBytes(filename, byteArray); //might wanna catch exceptions that could occur here 
    return "Webservice says OK"; 
}