0

関連するすべてのトピックを確認しましたが、何も役に立ちませんでした。私はURL書き換えを使用せず、ボタンをクリックしません。私のWebサービスは他のサービスからのPOSTを期待しており、特定のペイロードで200OKを返す必要があります。

「わかりました、特定のサーブレットは投稿をサポートしていません」と言う人もいるかもしれません。最も紛らわしいのは、Chrome Simple RESTクライアントからPOSTを送信すると、それが機能することです。サードパーティのWebサービスが同じPOSTを送信すると、エラーが発生します。

これが私がしていることです。私はASP.NET開発サーバーをトンネリングによって外部から到達できるWebサービスとして使用しています(このトピックのおかげで)->これはRESTクライアントから機能します。次に、「パス'EndPoint'へのアクセスに使用されるHTTP動詞POSTは許可されていません」という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);            

    }

これはトンネルモニターからのログです

<!-- 
[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)
-->

編集回答は簡単でした。外部サービスは、「/」のないサブスクライブされたURLではなくEndPoint /に送信していました。つまり、EndPointです。

4

1 に答える 1

2

以下が機能するはずです。

<httpHandlers>   
    <add verb="*" path="EndPoint" type="MyHandler/*" />
</httpHandlers>
于 2013-02-08T06:44:48.183 に答える