我有一个带有REST Web服务的asp.net Web应用程序可以在本地工作,但是当我将它上传到Azure时它不再起作用了......我正在进行POST同步,但是我可以在我看到执行GET的日志文件。
我已根据建议的here和here更新了我的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 ....: - (
答案 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>