関連するすべてのトピックを確認しましたが、何も役に立ちませんでした。私は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 '/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)
-->
編集回答は簡単でした。外部サービスは、「/」のないサブスクライブされたURLではなくEndPoint /に送信していました。つまり、EndPointです。