Android端向SOAP Web Service上传图片失败问题求助
你好!我看了你遇到的Android向SOAP服务传图片的问题,之前能正常下载但上传卡壳确实头疼,咱们一步步来分析下可能的问题点和解决方向:
先梳理下你遇到的两个核心错误原因:
用
String.class作为参数类型时,报414 request-uri too large
这个错误很明确:Base64编码后的图片字符串太长,超出了HTTP GET请求的URI长度限制。大概率是你的SOAP请求默认用了GET方式,或者服务端配置有问题把参数拼到了URL里——毕竟图片转成Base64后体积会比原文件大30%左右,稍微大一点的图片就容易触发这个问题。用
Base64.class作为参数类型时,报Server was unable to process request
这个是因为客户端和服务端的参数类型不匹配:你的服务端FunAttachFile方法里的AttachFile参数是String类型,但客户端传了Base64对象,.NET的SOAP服务无法把这个对象序列化成它期望的字符串,自然就报错了。
针对性的解决建议:
1. 先把参数类型统一成String.class,解决类型不匹配问题
服务端期望接收的是Base64编码后的字符串,所以客户端必须用String.class作为参数类型,之前的类型错误是核心问题之一。修改客户端的参数设置:
pi = new PropertyInfo(); pi.setName(Param_FunAttachFile_AttachFile); pi.setValue(params[2]); // params[2]是你用ImageUtil.convert生成的Base64字符串 pi.setType(String.class); // 和服务端的String类型严格匹配 request.addProperty(pi);
2. 解决414 request-uri too large问题
- 确保请求用POST方式:
HttpTransportSE的call方法默认应该是POST,但可以手动确认下,或者检查服务端是否强制要求POST(SOAP服务通常都是用POST的)。如果是GET导致的URI过长,换成POST就不会有这个问题,因为POST的参数是放在请求体里的,没有长度限制(只要服务端配置了足够大的请求体大小)。 - 压缩图片体积:你的
ImageUtil里用的是PNG格式压缩,PNG是无损格式,调质量参数没用,换成JPEG格式能大幅减小Base64字符串的长度。修改convert方法:
public static String convert(Bitmap bitmap) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 用JPEG格式,质量设为70(可根据需求调整,数值越小体积越小) bitmap.compress(Bitmap.CompressFormat.JPEG, 70, outputStream); return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT); }
3. 排查服务端是否接收到参数
你已经有日志类WriteToTextFileClass,可以在服务端的FunAttachFile方法里加更详细的日志,确认参数是否真的传过来了:
<WebMethod(Description:="write file")> Public Function FunAttachFile(ByVal AcntCode As String, ByVal AttachFile As String) As Boolean Dim log As New WriteToTextFileClass log.WriteTxt("Start Request ...") log.WriteTxt("AcntCode received: " & AcntCode) If AttachFile Is Nothing Then log.WriteTxt("AttachFile is NULL") Else log.WriteTxt("AttachFile length: " & AttachFile.Length.ToString()) End If Return True End Function
通过日志你能清楚知道是客户端没传成功,还是服务端接收后处理有问题。
4. 其他小细节
- 调整超时时间:你当前设置的是10秒,如果图片比较大,上传可能会超时,把超时时间延长一点:
HttpTransportSE androidHttpTransport = new HttpTransportSE(path, 30000); // 30秒超时
- 确认SOAP_ACTION正确性:
SOAP_ACTION_FunAttachFile必须是NAMESPACE + METHOD_NAME_FunAttachFile,比如你的NAMESPACE是http://yourdomain.com/,那SOAP_ACTION应该是http://yourdomain.com/FunAttachFile,这个如果写错了,服务端也会无法处理请求。
总结下操作步骤:
- 把客户端的
AttachFile参数类型改回String.class - 修改图片压缩方式为JPEG,减小Base64体积
- 确保SOAP请求用POST方式(
HttpTransportSE默认是POST,一般不用改,但可以确认) - 给服务端加日志,排查参数接收情况
- 适当延长上传超时时间
按照这个思路调整后,应该能解决你的问题,如果还有问题,可以把服务端的日志结果发出来,咱们再进一步排查!
备注:内容来源于stack exchange,提问作者user2056647

