4

Windows サービス アプリケーションで ASP.NET Web API を自己ホストする方法を説明している Web 上の記事を見たことがあります (ここここを参照)。サービスの開始時にセルフホストを開始し、サービスの停止時に停止するように、VB.NET でいくつかの簡単なコードを作成しました。

Protected Overrides Sub OnStart(ByVal args() As String)
    Try
        ' init a new self host configuration using the base address
        _config = New HttpSelfHostConfiguration(New Uri("http://localhost:8080"))

        ' map the URLs into the config
        MapRoutes(_config)

        _server = New HttpSelfHostServer(_config)
        ' start the server and wait for requests
        _server.OpenAsync()

    Catch ex As Exception
        Throw
    End Try
End Sub

Protected Overrides Sub OnStop()
    Try
        _server.CloseAsync().Wait()
        _server.Dispose()
    Catch ex As Exception
        Throw
    End Try
End Sub
#End Region

Private Sub MapRoutes(ByVal config As HttpSelfHostConfiguration)

    ' add route mappings
    With config.Routes
        .MapHttpRoute("API Default", "api/{controller}/{id}", New With {.id = RouteParameter.Optional})
    End With
End Sub

私の単純なコントローラーは次のようになります。

Public Class ClassesController
    Inherits ApiController

    Private _classes As List(Of [Class]) = New List(Of [Class])()

    Public Sub New()

        With _classes
            .Add(New [Class]() With {.ID = 1, .Name = "Geometry"})
            .Add(New [Class]() With {.ID = 2, .Name = "English 101"})
            .Add(New [Class]() With {.ID = 3, .Name = "Psychology 101"})
            .Add(New [Class]() With {.ID = 4, .Name = "Chemistry 101"})
            .Add(New [Class]() With {.ID = 5, .Name = "Physical Education"})
            .Add(New [Class]() With {.ID = 6, .Name = "Study Hall"})
            .Add(New [Class]() With {.ID = 7, .Name = "Wood Shop"})

        End With
    End Sub

    <HttpGet()>
    Public Function GetAll() As HttpResponseMessage

        Dim resp As HttpResponseMessage = Request.CreateResponse(Of List(Of [Class]))(HttpStatusCode.OK, _classes)

        Return resp

    End Function

    <HttpGet()>
    Public Function GetOne(ByVal id As Integer) As HttpResponseMessage

        Dim theClass As [Class] = (From c As [Class] In _classes
                                  Where c.ID = id
                                  Select c).FirstOrDefault()

        If theClass Is Nothing Then
            Return Request.CreateResponse(Of String)(HttpStatusCode.NotFound, "The requested class could not be found.")
        End If

        Return Request.CreateResponse(Of [Class])(HttpStatusCode.OK, theClass)

    End Function
End Class

サービスは問題なくコンパイルされ、installutil を使用してインストールされ、問題なく起動するようです。ただし、URL にアクセスすると、サービスがクラッシュし、イベント ログに次のメッセージが残ります。

アプリケーション: WebAPISelfHostPOC.exe フレームワーク バージョン: v4.0.30319 説明: 未処理の例外が発生したため、プロセスが終了しました。例外情報: System.Runtime.CallbackException スタック: System.Runtime.Fx+AsyncThunk.UnhandledExceptionFrame(System.IAsyncResult) で System.Net.LazyAsyncResult.Complete(IntPtr) で System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr) ) System.Net.ListenerAsyncResult.WaitCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) で System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) で

エラーが発生しているアプリケーション名: WebAPISelfHostPOC.exe、バージョン: 1.0.0.0、タイム スタンプ: 0x50217b41 エラーが発生しているモジュール名: KERNELBASE.dll、バージョン: 6.1.7601.17651、タイム スタンプ: 0x4e211319 例外コード: 0xe0434352 エラー オフセット: 0x0000b9bc エラーが発生しているプロセス ID: 0x2b58アプリケーションの開始時間: 0x01cd74dbf3f6b8a5 障害のあるアプリケーション パス: C:\Gravic\Development\WebAPISelfHostPOC\WebAPISelfHostPOC\bin\Debug\WebAPISelfHostPOC.exe 障害のあるモジュール パス: C:\Windows\syswow64\KERNELBASE.dll レポート ID: 3e81d995-e0cf-11e1- b8b3-f80f41109bb9

Windows サービスで Web API を実行するサンプル コードを教えてもらえますか? または、コードで間違ったことを指摘してもらえますか?

ありがとう!

4

2 に答える 2

2

問題は、GAC にインストールされた一連の古いアセンブリであることが判明しました。これは、Web API のベータ インストールから取り残されたものです。プロジェクトで新しいアセンブリを参照することができ、問題は解決しました。

于 2012-08-16T18:06:56.243 に答える
0

サービスを実行しているアカウントはローカル管理者ですか?または、URLへのアクセスを許可する権限を割り当てましたか?

于 2012-08-07T23:36:14.573 に答える