android - 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)
解决方案
推荐阅读
- spring-boot - 如何将消息广播到所有套接字?
- bitbucket - Bitbucket 管道 - 缺少 PHP 扩展 zip
- json - 如何读取 $ussdResponse->Message 中的值
- r - 如何使用r中的两个向量和逻辑运算符形成逻辑“1”和“0”的矩阵?
- spring-mvc - Spring:@Valid 总是返回 False
- python-3.x - 通过删除无穷大来创建数组
- java - 如何检索 IoT 中心数据的属性,而不仅仅是实际有效负载
- kubernetes - 如何在 Kubernetes 中配置已经运行的集群
- google-maps - 如何在 vuetify 项目中使用本地文件获取自定义 gmap 图标
- python - 如何使用 tf.constant 或 numpy 数组初始化 tf.Variable?