无法在POST网站上使用POST

时间:2017-03-02 15:33:25

标签: asp.net web-services rest azure azure-web-sites

我有一个带有REST Web服务的asp.net Web应用程序可以在本地工作,但是当我将它上传到Azure时它不再起作用了......我正在进行POST同步,但是我可以在我看到执行GET的日志文件。

我已根据建议的herehere更新了我的web.config,但它没有改变任何内容。

这是我的MessageController:

Imports System.Net
Imports System.Net.Http
Imports System.Web.Http
Imports Microsoft.Practices.EnterpriseLibrary.Logging

Public Class Test
    Public Subject As String
    Public Body As String
End Class

Public Class MessagesController
    Inherits ApiController

    ' GET api/<controller>
    Public Function GetAllValues() As DataTable
    ...
    End Function
' POST api/<controller>
Public Function PostValue(<FromBody()> ByVal value As Test) As HttpResponseMessage
...
End Function

我还尝试将Function PostValue更改为Sub PostValue但没有成功。

我的Global.asax看起来像这样:

Imports System.Web.SessionState
Imports System.Web.Http

Public Class Global_asax
    Inherits System.Web.HttpApplication

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        Web.Routing.RouteTable.Routes.MapHttpRoute(name:="DefaultApi", routeTemplate:="api/{controller}/{id}", defaults:=New With {
        Key .id = System.Web.Http.RouteParameter.[Optional]})
End Sub

如果GetAllValues存在,PostAsync会因任何原因调用GetAllValues。如果我删除GetAllValues进行测试,我会得到&#34;方法不被允许&#34;。

这是我在测试aspx页面上用来调用REST Web服务的方法:

Private Async Sub PostTest_Click(sender As Object, e As EventArgs) Handles PostTest.Click
    Dim m As New Test
    m.Subject = "Test"
    m.Body = "Testbody"

    Dim client As New Http.HttpClient

    Dim JsonData As String = JsonConvert.SerializeObject(m)
    Dim theContent As New Http.StringContent(JsonData, Encoding.UTF8, "application/json")
    Dim aResponse As Http.HttpResponseMessage = Await client.PostAsync("https://example.com/api/messages/", theContent)

更新 当我从控制器中删除GET方法时,我收到错误消息&#34; MethodNotAllowed&#34;。仔细查看返回的内容会让我更加困惑。内容是:

{"Message":"The requested resource does not support http method 'GET'."}

但我正在使用Await客户端。发布异步....?

更新2 我也尝试过PostAsJsonAsync,但错误仍然是&#39; GET&#39; 不受支持....

更新3 我现在使用Fiddler似乎POST本身运行良好...使用Fiddler Composer我可以将POST发送到我的azure https URL并按预期触发POST过程...现在我不知道#39;不知道为什么client.PostAsync和client.PostAsJsonAsync似乎都发送GET到azure live url,而相同的代码在我的localhost上发送一个POST ....: - (

2 个答案:

答案 0 :(得分:2)

最后我找到了答案......我不得不删除尾随的斜线!我已经使用了&#34; https://example.com/api/messages/&#34;无论我使用的是PostAsync还是PostAsJsonAsync,这都会自动产生GET。

使用&#34; https://example.com/api/messages&#34; GET和POST似乎都运行良好!!

答案 1 :(得分:0)

  

我有一个带有REST Web服务的asp.net Web应用程序在本地工作正常,但是当我将它上传到Azure时它不再起作用了

您的开发环境和Azure Web App之间可能包含不同的IIS配置。似乎所有请求都被视为服务器端的GET请求。

您可以向Web.config添加一些配置以启用所有动词。配置取决于托管管道模式。如果您在Azure Web App上选择的模式是“集成”,则可以使用以下代码。

<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0"
       path="*."
       verb="*"
       type="System.Web.Handlers.TransferRequestHandler"
       preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

如果您在Azure Web App上选择的版本是Classic,则可以使用以下代码。

<handlers>
   <remove name="WebDAV" />
   <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
   <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"
      path="*."
      verb="*"
      modules="IsapiModule"
      scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll"
      preCondition="classicMode,runtimeVersionv4.0,bitness64"
      responseBufferLimit="0" />
</handlers>