当前位置: 首页 > 编程语言 > C#

无法从webapiPOST中读取文本数据share

时间:2023-04-10 17:40:32 C#

我有一个这样的处理程序设置:publicclassMyTestHandler:DelegatingHandler{protectedoverrideSystem.Threading.Tasks.TaskSendAsync(HttpRequestMessagerequest,System.Threading.CancellationTokencancellationToken){if(request.Content.IsFormData()){request.Content.ReadAsStreamAsync().ContinueWith(x=>{varresult="";using(varsr=newStreamReader(x.Result)){result=sr.ReadToEnd();}Console.Write(result);});}returnbase.SendAsync(request,cancellationToken);这是我的http请求:POSThttp://127.0.0.1/testHTTP/1.1Connection:Keep-AliveContent-Length:29Content-Type:application/x-www-form-urlencodedExpect:100-continueHost:127.0.0.1my_property=my_value问题是,无论我如何尝试从request.Content中读取,它始终是空的。我尝试了request.Content.ReadAsStreamAsyncrequest.Content.ReadAsFormDataAsyncrequest.Content.ReadAs以及[HttpGet,HttpPost]publicstringIndex([FromBody]stringmy_property){//my_property==nullreturn"Test";}没什么,如果它有效。我无法从身体中取出数据。我在Windows7上的IIS中托管并使用Fiddler提交请求。我究竟做错了什么?问题是,对于WebApi,主体只被读取一次。我有一个正在运行的HTTP模块,它记录请求的所有详细信息并正在读取文本。这很丑陋,但从最初的修补来看,您实际上可以替换DelegatingHandler中的内容...protectedoverriderequest.Content.ReadAsStreamAsync().Result.CopyTo(stream);stream.Seek(0,SeekOrigin.Begin);//复制“供以后使用”的内容stringquery=newStreamReader(stream).ReadToEnd();stream.Seek(0,SeekOrigin.Begin);//如果进一步处理取决于内容类型//继续并获取当前值varcontentType=request.Content.Headers.ContentType;request.Content=newStreamContent(stream);request.Content.Headers.ContentType=contentType;返回base.SendAsync(request,cancellationToken);我不知道这是好的形式还是坏的(可疑的坏),但是......它似乎工作并遵循我看到的模型建议那些需要修改请求标头和内容“在途中"与DelegatingHandler。您的里程可能会有很大差异我的答案是基于brmore的代码;此函数可以安全地读取任何处理程序中的内容privatestringSafeReadContentFrom(HttpRequestMessagerequest){varcontentType=request.Content.Headers.ContentType;varcontentInString=request.Content.ReadAsStringAsync().Result;request.Content=newStringContent(contentInString);request.Content.Headers.ContentType=contentType;返回内容字符串;这对我有用。[HttpPost]publicIHttpActionResultIndex(HttpRequestMessagerequest){varform=request.Content.ReadAsFormDataAsync().Result;返回确定();}我遇到了同样的问题,最后选择不写日志中的内容。我正在记录内容类型和内容长度。但是,尽可能将所有内容写入日志始终是个好主意。但似乎目前使用WebApi我们无法实现这一点。您可以先创建提供者。MultipartMemoryStreamProvider()然后是Request.Content.ReadAsMultipartAsync(provider);然后阅读内容以上是C#学习教程:无法从webapiPOST读取文本数据分享的全部内容,如果对大家有用,需要进一步了解C#希望大家多多关注本教程——publicasyncTaskPost(intid,stringtype){//检查请求是否包含multipart/form-data。if(!Request.Content.IsMimeMultipartContent("form-data"))returnBadRequest("Unsupportedmediatype");尝试{varazureManager=newAzureManager();varimageManager=newImageManager();varprovider=newMultipartMemoryStreamProvider();等待Request.Content.ReadAsMultipartAsync(provider);();foreach(varfileinprovider.Contents){varstream=awaitfile.ReadAsStreamAsync();varguid=Guid.NewGuid();字符串blobName=guid.ToString();等待azureManager.UploadAsync(blobName,stream);varasset=newAsset{PropertyId=id,FileId=guid,FileName=file.Headers.ContentDisposition.FileName.Trim('"').ToLower(),FileSize=file.Headers.ContentLength??0,MimeType=file.Headers.ContentType.MediaType.ToLower()};if(type=="photos"){asset.Type=AssetType.Photo;//使用(MemoryStreamthumb=imageManager.ResizeImage(stream,320,180))将副本调整大小并裁剪为16:9{awaitazureManager.UploadAsync(blobName,thumb,BlobContainers.Thumbs);}使用(MemoryStreamphoto=imageManager.ResizeImage(stream,1024,576)){awaitazureNameManager.UploadAsync(,photo,BlobContainers.Photos);}}否则asset.AssumeType();资产。添加(资产);}db.Assets.AddRange(资产);等待db.SaveChangesAsync();returnOk(new{Message="资产上传成功",Assets=assets});}catch(Exceptionex){returnBadRequest(ex.GetBaseException().Message);}}本文收集自网络,不代表立场。如涉及侵权请点击维权联系管理员删除如需转载请注明出处: