DNN 无法访问 DNN Api 控制器中的 POST 方法
DNN Cannot access POST method in DNN Api Controller
我的 GET 方法 WORKS 当我使用 url 以超级用户身份登录时很好(我得到了从数据库中提取的第一个用户的名称):
http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/GetMessage
但是我无法在同一控制器中使用 AJAX 或仅通过输入 url 来访问同一控制器中的 POST 方法(post 方法无法获得 hit/found):
http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage
这也失败了:
$('#sendChat').click(function (e) {
e.preventDefault();
var user = '@Model.CurrentUserInfo.DisplayName';
var message = $('#chatBoxReplyArea').val();
var url = '/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage';
$.post(url, { user: user, message: message }, function (data) {
}).done(function () {
});
});
错误信息是:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage'.
</Message>
<MessageDetail>
No action was found on the controller 'ChatApi' that matches the name 'SendMessage'.
</MessageDetail>
</Error>
有时:
"The controller does not support GET method"
尽管我在那里同时拥有 GET 和 POST,并且 GET 有效。我错过了什么?
我在我的 DNN 项目中做了路由 class:
using DotNetNuke.Web.Api;
namespace AAAA.MyChatServer
{
public class RouteMapper : IServiceRouteMapper
{
public void RegisterRoutes(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute("MyChatServer", "default", "{controller}/{action}", new[] { "AAAA.MyChatServer.Services" });
}
}
}
我在名为 AAAA.MyChatServer:
的项目的文件夹服务中添加了一个 DNN Api 控制器
using DotNetNuke.Web.Api;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
namespace AAAA.MyChatServer.Services
{
[DnnAuthorize(StaticRoles = "SuperUser")]
public class ChatApiController : DnnApiController
{
[HttpGet]
public HttpResponseMessage GetMessage()
{
ChatServerManager csm = new ChatServerManager();
var users = csm.GetAllUsers();
var user = users.FirstOrDefault().Name;
return Request.CreateResponse(System.Net.HttpStatusCode.OK, user);
}
[System.Web.Http.HttpPost]
public HttpResponseMessage SendMessage(string toUser, string message)
{
return Request.CreateResponse(System.Net.HttpStatusCode.OK);
}
}
}
您的 SendMessage 网站 Api 包含 2 个参数,因此它应该 POST 在查询字符串中:
http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage?touser=john&message=hello
如果你想POST它使用对象的数据,你需要将Web服务参数设为对象模型
您的 javascript 参数也不同于 Web 服务,因为它使用 "toUser"
有两种方法可以调用 DNN WebAPI 中的 POST 方法:使用参数和使用对象。如果您像在 SendMessage 方法中那样使用参数,则需要通过查询字符串传递这些参数值。
另一方面,创建一个对象并通过调用 WebAPI 方法发送该对象可以处理更多场景,并且可以说是处理任何 POST 方法的更好方法(因为它隐藏了那些窥探的价值,使电话更难伪造)。要处理此问题,您可以从 SendMessage 方法中删除参数,而是在方法中查询 HttpContext.Current.Request 对象。您创建的对象 { user: user, message: message }
将位于某处。
正如您的示例中所写,您的对象像夜间的两艘船一样驶过您的参数。
我自己才刚刚弄明白这一点,我还没有完全理解我所需要的,但希望这对你有所帮助。以下是我在寻求使用 cURL 将文件上传到我的 DNN WebAPI 时参考的一些文章:
- https://www.dnnsoftware.com/community-blog/cid/134676/getting-started-with-dotnetnuke-services-framework
- https://www.dnnsoftware.com/community-blog/cid/144400/webapi-tips
- How To Accept a File POST
- https://forums.asp.net/t/2104884.aspx?Uploading+a+file+using+webapi+C+
- https://talkdotnet.wordpress.com/2014/03/18/dotnetnuke-webapi-helloworld-example-part-one/comment-page-1/
- http://dnnmodule.com/Article/ArticleDetail/tabid/111/ArticleId/511/Dotnetnuke-7-0-WebAPI-Tips.aspx
祝你好运!
我的 GET 方法 WORKS 当我使用 url 以超级用户身份登录时很好(我得到了从数据库中提取的第一个用户的名称):
http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/GetMessage
但是我无法在同一控制器中使用 AJAX 或仅通过输入 url 来访问同一控制器中的 POST 方法(post 方法无法获得 hit/found):
http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage
这也失败了:
$('#sendChat').click(function (e) {
e.preventDefault();
var user = '@Model.CurrentUserInfo.DisplayName';
var message = $('#chatBoxReplyArea').val();
var url = '/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage';
$.post(url, { user: user, message: message }, function (data) {
}).done(function () {
});
});
错误信息是:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage'.
</Message>
<MessageDetail>
No action was found on the controller 'ChatApi' that matches the name 'SendMessage'.
</MessageDetail>
</Error>
有时:
"The controller does not support GET method"
尽管我在那里同时拥有 GET 和 POST,并且 GET 有效。我错过了什么?
我在我的 DNN 项目中做了路由 class:
using DotNetNuke.Web.Api;
namespace AAAA.MyChatServer
{
public class RouteMapper : IServiceRouteMapper
{
public void RegisterRoutes(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute("MyChatServer", "default", "{controller}/{action}", new[] { "AAAA.MyChatServer.Services" });
}
}
}
我在名为 AAAA.MyChatServer:
的项目的文件夹服务中添加了一个 DNN Api 控制器using DotNetNuke.Web.Api;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
namespace AAAA.MyChatServer.Services
{
[DnnAuthorize(StaticRoles = "SuperUser")]
public class ChatApiController : DnnApiController
{
[HttpGet]
public HttpResponseMessage GetMessage()
{
ChatServerManager csm = new ChatServerManager();
var users = csm.GetAllUsers();
var user = users.FirstOrDefault().Name;
return Request.CreateResponse(System.Net.HttpStatusCode.OK, user);
}
[System.Web.Http.HttpPost]
public HttpResponseMessage SendMessage(string toUser, string message)
{
return Request.CreateResponse(System.Net.HttpStatusCode.OK);
}
}
}
您的 SendMessage 网站 Api 包含 2 个参数,因此它应该 POST 在查询字符串中: http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage?touser=john&message=hello
如果你想POST它使用对象的数据,你需要将Web服务参数设为对象模型
您的 javascript 参数也不同于 Web 服务,因为它使用 "toUser"
有两种方法可以调用 DNN WebAPI 中的 POST 方法:使用参数和使用对象。如果您像在 SendMessage 方法中那样使用参数,则需要通过查询字符串传递这些参数值。
另一方面,创建一个对象并通过调用 WebAPI 方法发送该对象可以处理更多场景,并且可以说是处理任何 POST 方法的更好方法(因为它隐藏了那些窥探的价值,使电话更难伪造)。要处理此问题,您可以从 SendMessage 方法中删除参数,而是在方法中查询 HttpContext.Current.Request 对象。您创建的对象 { user: user, message: message }
将位于某处。
正如您的示例中所写,您的对象像夜间的两艘船一样驶过您的参数。
我自己才刚刚弄明白这一点,我还没有完全理解我所需要的,但希望这对你有所帮助。以下是我在寻求使用 cURL 将文件上传到我的 DNN WebAPI 时参考的一些文章:
- https://www.dnnsoftware.com/community-blog/cid/134676/getting-started-with-dotnetnuke-services-framework
- https://www.dnnsoftware.com/community-blog/cid/144400/webapi-tips
- How To Accept a File POST
- https://forums.asp.net/t/2104884.aspx?Uploading+a+file+using+webapi+C+
- https://talkdotnet.wordpress.com/2014/03/18/dotnetnuke-webapi-helloworld-example-part-one/comment-page-1/
- http://dnnmodule.com/Article/ArticleDetail/tabid/111/ArticleId/511/Dotnetnuke-7-0-WebAPI-Tips.aspx
祝你好运!