首页 > 解决方案 > Java.Net.ProtocolException:当我尝试将 laravel api 与 xamarin 一起使用时,流意外结束

问题描述

目前我想插入文本类型的数据和图像类型的文件,考虑的问题是图像,我不知道为什么。

代码 C#

public async Task<string> CreateUsuario(string nombre, string apellidos, String fechaNac, string sexo, string correo, string phone, string pass, MediaFile IdArchivo)
{
    string resultado = "";

    MultipartFormDataContent from = new MultipartFormDataContent();
    byte[] bytesI;
    if (IdArchivo != null)
    {
        using (var memoryStream = new MemoryStream())
        {
            IdArchivo.GetStream().CopyTo(memoryStream);
            bytesI = memoryStream.ToArray();
            HttpContent content = new StringContent("idArchivo");
            content.Headers.ContentLength=7000;
            from.Add(content, "idArchivo");
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "idArchivo",
                FileName = String.Concat(Path.GetRandomFileName(), ".jpg")
            };
            from.Add(content);
        }
    }


    var contenido = new StringContent(nombre);
    from.Add(contenido, "Nombre");
    contenido = new StringContent(apellidos);
    from.Add(contenido, "Apellidos");
    contenido = new StringContent(fechaNac);
    from.Add(contenido, "FechaNac");
    contenido = new StringContent(sexo);
    from.Add(contenido, "Sexo");
    contenido = new StringContent(correo);
    from.Add(contenido, "Correo");
    contenido = new StringContent(phone);
    from.Add(contenido, "Phone");
    contenido = new StringContent(pass);
    from.Add(contenido, "Pass");


    HttpClient client = new HttpClient();

    try
    {

        var response = new HttpResponseMessage();
        response = await client.PostAsync(string.Concat(URL, "usuarios"), from);
        resultado = await response.Content.ReadAsStringAsync();
    }
    catch (Exception ex)
    {

    }

    return resultado;
}

在邮递员中,如果我使用邮递员方法正确插入并在请求中使用文件,但是当我想为 xamarin 进行插入时,不再发出请求。

我更改了具有 debian 9 操作系统的服务器的 php.ini,以将 upload_max_size 和 post_max_size 分别增加到 200 和 800 MB,以增加文件发送容量,但它无论如何都不起作用。

代码 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.enyeradminapp">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <application android:label="EnyerAdminApp.Android" android:usesCleartextTraffic="true" android:theme="@style/MainTheme"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>

    <application android:label="EnyerAdminApp.Android" android:usesCleartextTraffic="true">
        <provider android:name="android.suport.v4.content.FileProvider"
                  android:authorities="com.companyname.enyeradminapp.fileprovider"
                  android:exported="false"
                  android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                       android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>
</manifest>

代码 AssemblyInfo.cs

 // Add some common permissions, these can be removed if not needed
    [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
    [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
    [assembly: Application(UsesCleartextTraffic = true)]

正如您在上面的代码中看到的,我在清单和 AssemblyInfo.cs 中添加了代码行 UsesCleartextTraffic = true

我得到的错误如下:

错误

Java.Net.ProtocolException: unexpected end of stream
  at Java.Interop.JniEnvironment+InstanceMethods.CallIntMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <8b3b636835d84984ba4604c1f57b1983>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualInt32Method (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <8b3b636835d84984ba4604c1f57b1983>:0 
  at Java.Net.HttpURLConnection.get_ResponseCode () [0x0000a] in <44e54a86dea24313a2bdb807df77c27a>:0 
  at Xamarin.Android.Net.AndroidClientHandler+<>c__DisplayClass46_0.<DoProcessRequest>b__2 () [0x00000] in <44e54a86dea24313a2bdb807df77c27a>:0 
  at System.Threading.Tasks.Task`1[TResult].InnerInvoke () [0x0000f] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Future.cs:534 
  at System.Threading.Tasks.Task.Execute () [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2319 
--- End of stack trace from previous location where exception was thrown ---

  at Xamarin.Android.Net.AndroidClientHandler.DoProcessRequest (System.Net.Http.HttpRequestMessage request, Java.Net.URL javaUrl, Java.Net.HttpURLConnection httpConnection, System.Threading.CancellationToken cancellationToken, Xamarin.Android.Net.AndroidClientHandler+RequestRedirectionState redirectState) [0x00372] in <44e54a86dea24313a2bdb807df77c27a>:0 
  at Xamarin.Android.Net.AndroidClientHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x002d0] in <44e54a86dea24313a2bdb807df77c27a>:0 
  at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Http/src/System/Net/Http/HttpClient.cs:506 
  at EnyerAdminApp.Services.ApiRest.CreateUsuario (System.String nombre, System.String apellidos, System.String fechaNac, System.String sexo, System.String correo, System.String phone, System.String pass, Plugin.Media.Abstractions.MediaFile IdArchivo) [0x00299] in C:\ProyectosDesarrollo\OurProducts\EnyerAdminApp\trunk\EnyerAdminApp\EnyerAdminApp\Services\ApiRest.cs:67 
  --- End of managed Java.Net.ProtocolException stack trace ---
java.net.ProtocolException: unexpected end of stream
    at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.close(HttpConnection.java:314)
    at com.android.okhttp.okio.RealBufferedSink.close(RealBufferedSink.java:241)
    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:773)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:463)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:521)

标签: androidapixamarinxamarin.forms

解决方案


推荐阅读