3

我有一个 C# 网络服务,例如:

namespace MyProject
{
  #region "Frontend"

  [WebService(Name="MyWebservice")]
  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  [System.ComponentModel.ToolboxItem(false)]
  public class MyWsClass : System.Web.Services.WebService
  {
     private static readonly IRegisterer reg = new SelfRegisterInDatabase();

     private MyWsClass() 
     {
       // tell who I am to a database
       MyWsClass.reg.SelfRegister();
     }

     // A service I expose to the users
     [WebMethod]
     public object MyMethod(object in)
     {
       // do some work
       return new Object();
     }
  }

  #endregion

  #region "Backend"

  public interface IRegisterer
  {
    public void SelfRegister();
  }

  // Herein lies my question:
  public class SelfRegisterInDatabase : IRegisterer
  {
    private static volatile bool IsRegistered = false;

    public void SelfRegister()
    {
      if(!IsRegistered)
      {
        // Expecting something like: "http://THEHOST:THEPORT/MyWebservice.aspx?WSDL"
        // In principle, the variable part is "THEHOST:THEPORT".
        string EndpointUrl = 
"HOW_DO_I_GET_WEBSERVICE_ENDPOINT_URL_HERE???"
        ;

        // 1) open a Database connection;
        // 2) insert new entry for this EndpointUrl string if doesn't exist;
        // 3) and close DB connection
        SelfRegisterInDatabase.IsRegistered = true;
      }
      return;
    }
  }
  #endregion
}

我想知道如何动态读取 web 服务自己的端点,以便我可以让它在数据库中注册(例如,SQL Server——实际的INSERTing 不是我在这里询问的内容)。我应该使用哪种方法/配置?

4

2 回答 2

2

试试这个来获取整个端点字符串:

WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString

你需要

using System.ServiceModel.Web;
于 2012-11-21T13:13:44.153 回答
0

如果您想要调用的完整端点地址(例如:http://your_webservice/your_resource/id/123):

string OriginalEndpoint = HttpContext.Current.Request.Url.OriginalString;

如果您不想要资源部分(例如:http://your_webservice),您可以用空字符串替换路径的本地部分:

string ServiceEndpoint = HttpContext.Current.Request.Url.OriginalString.Replace(HttpContext.Current.Request.Url.LocalPath, "");

你一定是using System.Web.HttpContext

于 2016-10-27T14:25:15.607 回答