【问题标题】:Yet another "The HTTP verb POST used to access path '[my path]' is not allowed"另一个“不允许使用用于访问路径 '[my path]' 的 HTTP 动词 POST”
【发布时间】: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 &#39;/EndPoint/&#39; 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/*"

标签: c# wcf post


【解决方案1】:

以下应该有效:

<httpHandlers>   
    <add verb="*" path="EndPoint" type="MyHandler/*" />
</httpHandlers>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多