【问题标题】:How to get a webservice's own endpoint in C#?如何在 C# 中获取 Web 服务自己的端点?
【发布时间】:2012-11-09 17:43:48
【问题描述】:

我有一个 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 不是我在这里问的)。我应该使用哪种方法/配置?

【问题讨论】:

    标签: c# web-services url endpoint


    【解决方案1】:

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

    WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString
    

    你需要

    using System.ServiceModel.Web;
    

    【讨论】:

    • 几个愚蠢的问题,澄清一下:1)该参数只读在从[WebService]调用时才有效,因此(例如)从WebService类外部调用时它不起作用。它是否正确? 2) 如果应该从 [WebService] 类中调用,是仅限于 [WebMethod] 还是可以在 [WebService] 类构造函数中调用?
    【解决方案2】:

    如果您想要调用的完整端点地址(例如: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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2012-06-20
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多