首页 > 其他分享 >webapi 问题收集

webapi 问题收集

时间:2022-09-29 12:31:50浏览次数:47  
标签:webapi function 请求 收集 问题 result OPTIONS errorCallBack


webapi 问题收集

1 请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized()

当启动webapi项目调用其中一个url时报该错误,解决方法如下:

之前是这么写的:
WebApiConfig.Register(GlobalConfiguration.Configuration);
改为:
GlobalConfiguration.Configure(WebApiConfig.Register);

问题就解决了。

2 Ajax调用webapi接口,报错:Response for preflight has invalid HTTP status code 405,method not allowed

服务端的webapi接口用fiddler,或swagger,postman调用都没问题,

服务端的方法如下:

[HttpPost]
[Route("getnews")]
public DtoResponse<DtoNewsSimple> GetNews(DtoRequest call, int newsId)
{
var result = News.GetNewsById(newsId);
return result;
}

前端调用如下:

function GetDataTest( ) {
var req = {
"SessionId": "akjlmksdifklsdkkkosldiofkklkjsd",
"UsePool": true,
"ResponseSign": "sdfwedfvdsfe",
"AppId": 4,
"Ip": "127.0.0.1"
};

ajaxProcess("http://localhost:83/news/getnews?newsId=44901", req, function callSuccess(oRet) {
var result = oRet.Data;
if (result != null) {

} else {

}

}, function callError(e) {
//alert(e);
});
}

$.ajax({
url: url,
type: "POST",
timeout: waitSconds,
headers: { "Content-Type": "application/json" },
data: JSON.stringify(pdata),
success: function (result) {
if (successCallBack) {
if (result == null) {
if (errorCallBack) errorCallBack();
return;
}
if (result.err) {
if (errorCallBack) errorCallBack(result.err);
} else {
successCallBack(result);
if (okCallback) okCallback();
}
}
if (proccessObj) proccessObj.removeChild(a);
}, error: function (err) {
if (errorCallBack) errorCallBack(err);
if (proccessObj) proccessObj.removeChild(a);
if (errCallback) errCallback();
}
});

ajax调用里不加headers这个设置  headers: { "Content-Type": "application/json" }, 可以调用到该action,但call参数获取不到,加上headers则报如题的错误,解决方法分二步,

一是在web.config 加上如下设置,有些设置项不是针对解决此问题的,一并贴上:

<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" />
<add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol></system.webServer>

二是在 global.asax.cs 里加上

   

protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.End();
} }

原因分析:后来注意到失败的请求Method是OPTIONS,奇怪了,明明是Post请求,怎么出现了Method为OPTIONS的请求呢?在Global.asax里加上如下处理:

protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.End();
}
}


 
再试,成功了。但是看记录,会有两个请求,一个是OPTIONS请求返回200成功,一个是自己的PUT请求,返回200成功。那么这个OPTIONS请求到底是什么?百度了一下得到了答案:

Preflighted Requests(预检请求)
Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。

下面的2种情况需要进行预检:

1、简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求;

2、中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等。

原来如此,在js发起PUT请求的时候,头部设置了XMLHttpRequest.setRequestHeader("Content-Type", "application/json"),所以请求的时候会多出一个OPTIONS,如果去掉这个头,就不会多出这次请求了。
 

这个地方也有个问题,如果注册了这个处理类 internal class RequestMessageHandler : DelegatingHandler

发现在Application_BeginRequest加了上面的处理后还是无效,发现请求还是流转到后续的处理过程中,在RequestMessageHandler的SendAsync再加上这个处理即可,如下:

if (request.Method.ToString().ToUpper() == "OPTIONS")
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
return response;
}

3 "Error":"DynamicMethod 的类型所有者无效

在webapi中用了swagger来生成文档,但当某个方法的返回类型或方法用了泛型后就会报如题的错误,分析可能是swagger在解析泛型方法或返回值的时候不支持。

 

--- end ---

标签:webapi,function,请求,收集,问题,result,OPTIONS,errorCallBack
From: https://blog.51cto.com/u_15810749/5722472

相关文章

  • 【转】解决添加 aar(so库)后报 couldn't find "***.so" 错误,导致崩溃的问题
    原文:https://www.jianshu.com/p/4a6fb36d4f33最近项目中添加了第三方厂家的aar包后,APP出现了崩溃,log报错中有这么一行。java.lang.UnsatisfiedLinkError:dalvik.system.......
  • ue4 ue5 使用git管理经常无法编译的问题
    ue4或ue5使用git后,如果项目中出现任意中文文件就会导致代码无法编译。解决方案是修改下面的文件:C:\Users\【你的用户名】\AppData\Roaming\UnrealEngine\UnrealBuildToo......
  • svn使用遇到的问题总结
    1.提示文件冲突  解决办法:1.CODE.txt中保留需要的代码,其余的删掉。2.在冲突目录下,选中文件--右键菜单—TortoiseSVN—Resolved(解决)。会列出冲突的文件列表,如果确认......
  • teamcity使用问题收集
    teamcity使用问题收集1误删除工程project处理解决办法一次操作中本来是要在一个工程中删除一个子工程,但一不小心把整个工程都删除了,顿时蒙了,这样重新配置太麻烦了,冷......
  • vs2015使用问题收集
    vs2015使用问题收集 1 CS1617:选项“6”对/langversion无效 新建的一个asp.netwebapi项目,没填加任何代码,编译通过,但运行报“CS1617:选项“6”对/langversion无效......
  • nuget使用问题收集
    nuget使用问题收集1nuget无法在以下项目中安装或卸载选定的程序包有时在解决方案中安装或更新第三方包时会提示“nuget无法在以下项目中安装或卸载选定的程序包”,在列出......
  • 用swagger-ui来生成webapi接口文档并可以在线测试
    用swagger-ui来生成webapi接口文档并可以在线测试Swagger-UI简单而一目了然。它能够纯碎的基于html+javascript实现,只要稍微整合一下便能成为方便的API在线测试工具。项目的......
  • 百度ueditor 编辑器使用问题收集
    百度ueditor编辑器使用问题收集1setContent有时不起作用页面区显示编辑内容的控件如下<textareaid="contents"name="contents"style="width:100%;height:300px"><......
  • 常用网络诊断的命令收集
    常用网络诊断的命令收集>ipconfig 用于查看本机的ip,网关等信息IPConfig实用程序和它的等价图形用户界面——Windows95/98中的WinIPCfg可用于显示当前的TCP/IP配......
  • lsyncd使用中遇到的问题
    问题1:执行命令:/etc/init.d/lsyncdstatus显示:lsyncd已死,但pid文件仍存于是查看日志文件:cat/var/log/lsyncd/lsyncd.log日志里显示:Error:Terminatingsinceout......