【发布时间】:2013-02-07 21:47:02
【问题描述】:
我检查了所有相关主题,但没有任何帮助。我不使用 url 重写,我不点击任何按钮。我的 Web 服务需要来自其他服务的 POST,然后它应该返回带有特定负载的 200 OK。
有些人可能会说“好的,特定的 servlet 不支持 post”。 最令人困惑的是,当我从 Chrome Simple REST 客户端发送 POST 时,它可以工作! 当第三方网络服务向我发送相同的 POST 时,它会给我一个错误。
这就是我所做的,我使用 ASP.NET 开发服务器作为 Web 服务,可通过隧道从外部访问(感谢topic)-> 这适用于 REST 客户端。然后等待 POST,它给了我“不允许用于访问路径 'EndPoint' 的 HTTP 动词 POST”
这里是 web.config
<httpHandlers>
<add verb="*" path="EndPoint"
type="MyHandler" />
</httpHandlers>
我解析 POST 消息并返回所需消息的代码:
public class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var stream = context.Request.InputStream;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
string xml = Encoding.UTF8.GetString(buffer);
StringBuilder sb = new StringBuilder();
XDocument doc = XDocument.Parse(xml);
var id = XElement.Parse(xml)
.Descendants("id")
.First()
.Value;
string file = "c:/message.xml";
XDocument d = XDocument.Load(file);
d.Descendants("context").Where(x => x.Attribute("id").Value == id).Single().SetAttributeValue("value", "54");
d.Save(file);
string responseMessage = @"
<?xml version=""1.0"" encoding=""UTF-8""?>
<Message>
<code>Fine</code>
</Message>
";
context.Response.StatusCode = 200;
context.Response.AddHeader("Content-Type", "application/xml");
context.Response.Write(responseMessage);
}
这是来自隧道monitor的日志
<!--
[HttpException]: The HTTP verb POST used to access path '/EndPoint/' is not allowed.
at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
-->
编辑 答案很简单。外部服务发送到 EndPoint/ 而不是没有“/”的订阅 url,即 EndPoint。
【问题讨论】:
-
客户端似乎正在向
/EndPoint/发布您是否尝试在不带斜杠的情况下向/EndPoint发布? -
嗨达林,实际上现在客户端正在发布到 /EndPoint 没有斜线。等等,也许你是对的。这里的“客户”实际上是订阅服务。也许它本身在末尾添加了斜线。我将与外部客户端的程序员一起检查这一点。谢谢
-
您的应用程序中似乎有一些模块将请求重定向或覆盖到
/EndPoint/。你用 Fiddler 验证过客户端和服务器之间的流量吗? -
如果我把 / 放在这样的路径中可以吗: path="EndPoint/" ?问题是当我的服务没有响应时服务将我列入黑名单,并且它会延长消息发送时间,所以我需要重新做很多事情,等待等等
-
我不确定这是否可行,但您可以尝试一下。你也可以试试
path="EndPoint/*"。