当前位置: 首页 > 知识库问答 >
问题:

将图像从Android应用程序发布到C#WCF服务时出错

巫马昆琦
2023-03-14

上传的Java方法

public Boolean EnviarArquivo(File arquivo) throws IOException
{
    Boolean ret = false;

    Log.d(TAG, "Eviando arquivo via http");

    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(URLs.UPLOAD_ARQUIVO);
    ResponseHandler<String> responseHandler = new BasicResponseHandler();

    InputStream is = null;
    byte[] buffer = null;
    is = new FileInputStream(arquivo);
    buffer = new byte[is.available()];
    is.read(buffer);
    is.close();

    // Transformando array de bytes em String para enviar ao
    // servidor
    String imagemBase64 = Base64.encodeToString(buffer, Base64.DEFAULT);

    MultipartEntity entity = new MultipartEntity();
    entity.addPart("image", new StringBody(imagemBase64));
    httppost.setEntity(entity);

    try
    {
        String responseString = httpclient.execute(httppost, responseHandler);
        Log.d(TAG, "Arquivo enviado via http");
        ret = true;
    } 
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return ret;
}

C#WCF接口

[OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "uploadImagem", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    Bitmap uploadImagem(Stream imagem);

C#WCF服务

public Bitmap uploadImagem(Stream imagem)
    {
        LogWriter.WriteLog("Imagem recebida");

        try
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = imagem.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                buffer = ms.ToArray();
            }

            using (MemoryStream mStream = new MemoryStream())
            {
                mStream.Write(buffer, 0, buffer.Length);

                Bitmap bm = new Bitmap(mStream);
                return bm;
            }
        }
        catch (Exception)
        {
            return null;
        }
    }

Eclipse LogCat 10-15 14:24:45.138:D/UploadPhotos(14370):Eviando arquivo通过http 10-15 14:24:45.198:W/System。err(14370):android。操作系统。NetworkOnMainThreadException 10-15 14:24:45.208:W/System。err(14370):在android上。操作系统。StrictMode$AndroidBlockGuardPolicy。网络(StrictMode.java:1117)10-15 14:24:45.208:W/System。err(14370):在java。网InetAddress。lookupHostByName(InetAddress.java:385)10-15 14:24:45.208:W/System。err(14370):在java。网InetAddress。getAllByNameImpl(InetAddress.java:236)10-15 14:24:45.208:W/System。err(14370):在java。网InetAddress。getAllByName(InetAddress.java:214)10-15 14:24:45.208:W/System。err(14370):在组织。阿帕奇。http。impl。conn.DefaultClientConnectionOperator。openConnection(DefaultClientConnectionOperator.java:137)10-15 14:24:45.208:W/System。err(14370):在组织。阿帕奇。http。impl。conn.AbstractPoolEntry。打开(AbstractPoolEntry.java:164)10-15 14:24:45.208:W/System。err(14370):在组织。阿帕奇。http。impl。conn.AbstractPooledConnAdapter。开放(AbstractPooledConnAdapter.java:119)10-15 14:24:45.208:W/System。err(14370):在组织。阿帕奇。http。impl。客户DefaultRequestDirector。执行(DefaultRequestDirector.java:360)10-15 14:24:45.208:W/System。err(14370):在组织。阿帕奇。http。impl。客户AbstractHttpClient。执行(AbstractHttpClient.java:555)10-15 14:24:45.208:W/System。err(14370):在组织。阿帕奇。http。impl。客户AbstractHttpClient。执行(AbstractHttpClient.java:653)10-15 14:24:45.218:W/System。err(14370):在组织。阿帕奇。http。impl。客户AbstractHttpClient。执行(AbstractHttpClient.java:627)10-15 14:24:45.218:W/System。err(14370):在组织。阿帕奇。http。impl。客户AbstractHttpClient。执行(AbstractHttpClient.java:616)10-15 14:24:45.218:W/System。err(14370):在com。序言。papirosmart。应用程序。上传照片。EnviarArquivo(UploadPhotos.java:251)10-15 14:24:45.218:W/System。err(14370):在com。序言。papirosmart。应用程序。上传照片。SendFile(UploadPhotos.java:158)10-15 14:24:45.218:W/System。err(14370):在com。序言。papirosmart。应用程序。上传照片。SendFolders(UploadPhotos.java:121)10-15 14:24:45.218:W/System。err(14370):在com。序言。papirosmart。应用程序。上传照片。ExecutarRotina(UploadPhotos.java:81)10-15 14:24:45.218:W/System。err(14370):在com。序言。papirosmart。客户。主要活动。InicializeUploadFiles(MainActivity.java:128)10-15 14:24:45.218:W/System。err(14370):在com。序言。papirosmart。客户。主要活动。onResume(MainActivity.java:479)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。仪表。callActivityOnResume(Instrumentation.java:1187)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。活动performResume(Activity.java:5326)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。活动线程。performResumeActivity(ActivityThread.java:2599)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。活动线程。handleResumeActivity(ActivityThread.java:2647)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。活动线程。handleLaunchActivity(ActivityThread.java:2104)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。活动线程。访问$600(ActivityThread.java:138)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。ActivityThread$H.handleMessage(ActivityThread.java:1205)10-15 14:24:45.228:W/System。err(14370):在android上。操作系统。处理程序。dispatchMessage(Handler.java:99)10-15 14:24:45.228:W/System。err(14370):在android上。操作系统。活套。循环(Looper.java:137)10-15 14:24:45.228:W/System。err(14370):在android上。应用程序。活动线程。main(ActivityThread.java:4954)10-15 14:24:45.228:W/System。err(14370):在java。郎。反思。方法invokenactive(本机方法)10-15 14:24:45.238:W/System。err(14370):在java。郎。反思。方法调用(方法java:511)10-15 14:24:45.238:W/System。err(14370):在com.Android内部的操作系统。ZygoteInit$MethodandArgscaler。运行(ZygoteInit.java:798)10-15 14:24:45.238:W/System。err(14370):在com.Android内部的操作系统。合子岩。main(ZygoteInit.java:565)10-15 14:24:45.238:W/System。err(14370):在dalvik。系统国家艺术。主(本机方法)10-15 14:24:45.258:D/dalvikvm(14370):GC_并发释放2929K,32%释放7694K/11267K,暂停15ms 11ms,总计91ms

共有1个答案

樊令秋
2023-03-14

这里的问题是,你正试图在Android应用程序的主(UI)线程上进行联网。这将导致您的异常:

android.os.NetworkOnMainThreadException 

解决方案是在AsyncTask中运行网络代码。有关更多信息,请查看此SO问题。

 类似资料:
  • 我的MainActivity代码在这里:

  • 我正在尝试使用MSSQL服务器将我的django应用程序发布到azure。我正在使用django azure pyodbc和pyodbc进行连接,当它在本地工作时,每当我使用mssql发布时,我都会收到一个内部服务器错误,尽管发布成功。如果我使用预先打包的sqllite3服务器发布,它就可以工作。我使用的虚拟环境包括Python 3.4、Django 1.8.4、pyodbc 3.0.10和Dja

  • 问题内容: 我正在使用背景音乐创建游戏应用程序。我使用Android Service播放背景音乐是​​因为我想在更改活动时运行BGM。我的问题是,我在每个活动的onPause方法中都声明了finish()(我不想让用户返回并想杀死该活动)。 因此,当我打算进行其他活动时,它将调用onDestroy并停止该服务。我想停止该服务以完全退出应用程序(按下主页按钮),并想要通过onPause()中的BGM

  • 在 Azure 门户中将包部署到云服务时,我发现了以下问题: 所有实例都在等待角色启动,出现以下异常: 未处理的异常:Microsoft.ApplicationServer.Caching.DataCacheException web角色在Compute Emulator上运行良好。 我最近确实向我的系统添加了共址缓存,但我不知道如何查明问题所在。 当我检查该角色的事件日志时,我发现了以下两个错误

  • 问题内容: 寻找有关基于cf2010中的WCF REST模板40(CS)扩展的wcf 4 rest服务的指南。我花了最后两天的时间来尝试使该Bugger正常工作,并复习其他帖子,尽管我已经接近了,但似乎无法越过终点。经过很多挫败之后,它最终到达了服务并发布(使用fiddler请求构建器),但是method参数作为null出现,但已在请求构建器中正确设置。我猜这可能是配置问题,但是由于截止日期迫在眉

  • 我试图消费WCF服务在PhoneGap应用程序为Android使用jQuery ajax托管在内部网域。 作为回应,我将根据下面的ajax请求得到一条消息。 Ajax请求: 请求报头 响应报头 HTTP/1.1 415无法处理该消息,因为内容类型“application/x-www-form-urlencoded;charset=UTF-8“不是预期的类型”text/xml;字符集=utf-8'。