我要在android上往一个C#写的webservice上传图片,service的代码如下: public bool UploadCaseFile(string ServicePwd, string LoginName, string DocCode, string FileName, byte[] b)
        {
            if (!chkServicePwd(ServicePwd))
            {
                return false;
            }
            return Function.UploadCaseFile(LoginName, DocCode, FileName, b);
        }我客户端得代码如下: /**
 * 上传附件
 * 
 * @param ServicePwd
 * @param LoginName
 * @param DocCode
 * @param FileName
 * @param picByte byte类型
 * @return
 */
public Boolean upLoadPic(String ServicePwd, String LoginName,
String DocCode, String FileName, byte[] picByte) {
Base64 objbBase64=new Base64();
boolean ret=false;
METHOD_NAME = "UploadCaseFile";
SOAP_ACTION = "http://tempuri.org/UploadCase";
SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
rpc.addProperty("ServicePwd", ServicePwd);// 传递需要的参数
rpc.addProperty("LoginName", LoginName);
rpc.addProperty("DocCode", DocCode);
rpc.addProperty("FileName", FileName);
// 将二进制流变成字符串传输
rpc.addProperty("picByte",objbBase64.encodeBytesToBytes(picByte));
// rpc.addProperty("picByte",new SoapPrimitive(SoapEnvelope.ENC,"base64Binary",picByte));
try {
AndroidHttpTransport ht = new AndroidHttpTransport(URL);// 定义连接
ht.debug = true;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = rpc;// 将发送对象序列化
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
new MarshalBase64().register(envelope);
ht.call(SOAP_ACTION, envelope);// 呼叫发送
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();// 进去返回的数据结构
运行到这里就报错。
传递string可以 但是如上一传图片就错
请教怎么处理 啊,急用

解决方案 »

  1.   

    印象里面,直接弄会报一个UTF16啥的错误,貌似要做一次转换
      

  2.   

    你Web层的方法,最后参数不因该用byte数组吧 - =
    不是由String传入的吗?
      

  3.   

    上传一个字节数组也没啥问题,再笨点编码成base64,如果还不行的话 推荐你打下基础,哈哈
      

  4.   

    UploadCaseFile方法最后一个参数是 byte[] b,那么手机端就必须addProperty("b", ...),这个是.net建的webservice问题,xfire没这问题.你上面问题可以有2个解决方案:
    1, rpc.addProperty("b", picByte);// picByte必须是byte[]类型,怀疑不能传byte[]?放心ksoap会用Base64自动帮你转成String进行传输的,到服务器端自动帮你转会byte[];
    2, 服务器上的UploadCaseFile方法最后一个参数该成String str, picByterpc.addProperty("str", Base64().encode(picByte)); 然后用Base64().decode(str)转回byte[].
    推荐使用ksoap自带的Base64类.请楼主获得解决方案后及时结贴,这样才能提高大家帮忙回答问题的积极性,谢谢.
      

  5.   

    哥们 照你的改了还是不成功,郁闷啊
    public Boolean upLoadPic(String ServicePwd, String LoginName,
    String DocCode, String FileName, byte[] b) {
    boolean ret = false;
    METHOD_NAME = "UploadCaseFile";
    SOAP_ACTION = "http://tempuri.org/UploadCaseFile";
    SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
    rpc.addProperty("ServicePwd", ServicePwd);// 传递需要的参数
    rpc.addProperty("LoginName", LoginName);
    rpc.addProperty("DocCode", DocCode);
    rpc.addProperty("FileName", FileName);
    rpc.addProperty("b",b);
    // 将二进制流变成字符串传输
    // String data=new String(android.util.Base64.encodeToString(b, 0));
    // rpc.addProperty("b",new SoapPrimitive(SoapEnvelope.ENC,"base64Binary",data));  
    //rpc.addProperty("imgStr",android.util.Base64.encodeToString(b, 0));
    try {
    AndroidHttpTransport ht = new AndroidHttpTransport(URL);// 定义连接
    ht.debug = true;
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    SoapEnvelope.VER11);
    envelope.bodyOut = rpc;// 将发送对象序列化
    Log.e("信息", "将发送对象序列化");
    envelope.dotNet = true;
    envelope.setOutputSoapObject(rpc);
    (new MarshalBase64()).register(envelope);
    ht.call(SOAP_ACTION, envelope);// 呼叫发送
    Log.e("信息", "呼叫发送");
    SoapPrimitive result = (SoapPrimitive) envelope.getResponse();// 进去返回的数据结构
    Log.e("result信息", result.toString());
    return ret; } catch (Exception e) {
    e.printStackTrace();
    Log.e("信息", e.toString());
    return false;
    }
      

  6.   

    我改成这种方式还是不行  奇怪 
    有知道原因的吗
    // 取值
    String xmlInfo = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    + "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
    "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
    "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
    + "<soap12:Body>"
    + "<UploadCaseFileForAndroid xmlns=\"http://tempuri.org/\">"
    + "<ServicePwd>" + ServicePwd + "</ServicePwd>"
    + "<LoginName>" + LoginName + "</LoginName>" +
    "<DocCode>"+ DocCode + "</DocCode>" + 
    "<FileName>" + FileName+ "</FileName>" + 
    "<imgStr>" + Base64.encode(b).toString()+ "</imgStr>" + 
    "</UploadCaseFileForAndroid>"
    + "</soap12:Body></soap12:Envelope>";
    // 发送