如何在C#中获取Web服务自己的端点?

时间:2012-11-21 12:59:55

标签: c# web-services url endpoint

我有一个C#webservice,因此:

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
}

我想知道如何动态读取webservice自己的端点,这样我就可以在数据库中注册(比如,SQL Server - 实际的INSERT不是我要求的关于这里)。我应该使用哪种方法/配置?

2 个答案:

答案 0 :(得分:2)

尝试此操作以获取整个端点String:

WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString

你需要

using System.ServiceModel.Web;

答案 1 :(得分: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