0

例外の原因となったコードがあります。例外がスローされたのは 1 回だけであり、シナリオを複製することはできません。しかし、私はまだこのエラーを理解したいと思っています。コードは次のとおりです。

1 Dim myHost As System.ServiceModel.ServiceHost = New ServiceHost(New ClientService())
2 myBinding = New NetTcpBinding(SecurityMode.None)
3 Dim clientAddress As String = "net.tcp://127.0.0.1:3500/Client"
4 myHost.AddServiceEndpoint(GetType(IClientService), myBinding, clientAddress)

IP アドレスは一例です。本番環境では、クライアント マシンの有効な IP アドレスでした。4 行目で例外がスローされます。スタックは次のとおりです。

1   System.UriFormatException: Invalid URI: The hostname could not be parsed.
2   at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
3   at System.Uri..ctor(String uriString, UriKind uriKind)
4   at System.ServiceModel.ServiceHost.AddServiceEndpoint(Type implementedContract, Binding binding, String address, Uri listenUri)
5   at System.ServiceModel.ServiceHost.AddServiceEndpoint(Type implementedContract, Binding binding, String address)

質問:

  1. AddServiceEndpoint(Type implementedContract, Binding binding, String address)のみを呼び出した場合に、オーバーロードされた AddServiceEndpoint(Type implementedContract, Binding binding, String address, Uri listenUri)が呼び出されるのはなぜですか?

  2. その例外の考えられる原因は何ですか?

ありがとうございました。

編集:

clientAddress 文字列の実際のコードは次のとおりです。

clientAddress = String.Format(My.Resources.UrlTemplate,ip.AddressList(0).ToString(), CInt(Int((1024 - 808 + 1) * Rnd() + 808)))

どこ

Dim ip As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())

わかりやすくするために、最初のコード例を単純化しました。Resources.resx は、運用コードの埋め込みリソースです。

4

1 に答える 1

2
  1. には多くのオーバーロードがありAddServiceEndpoint、ほとんどの作業を行う 1 つのオーバーロードと、(通常) より少ないパラメーターを取り、より完全なオーバーロードを呼び出すだけのオーバーロードを用意するのが一般的です。スタックトレース。AddServiceEndpoint(Type, Binding, String)内部で呼び出しますAddServiceEndpoint(Type, Binding, String, Uri)

  2. あなたはそれがもう再現しないと言っているので、実際の値がなければ、何がうまくいかなかったのかを推測するのは難しい. 例外に基づいて、 の値clientAddressは間違いなく間違っていましたが、その問題の原因となった値を知らずに推測することしかできません。たとえば、"net.tcp://"その変数の値として使用すると、同じ例外が発生する可能性があります。

于 2013-04-03T22:34:32.993 に答える