Web サイトと wcf サービスを含む Azure に webrole を展開しています...
サイトは wcf からのサービスを使用します。
ここでの問題は、ステージング デプロイがエンドポイントのクレイジーな URL を作成し、web.config でエンドポイントを変更し続けなければならないことです...
URLがどうなるかを「予測」する方法、強制する方法、または「localhost」などの一般的なホストを指す方法があるかどうか疑問に思っています???
ロール検出を使用して、WCF エンドポイントを見つけることができるはずです。こちらの SO 回答と、リンク先のブログ投稿を参照してください。
Azure サービスに接続するための私自身の抽象基本クラスは、その記事に基づいています。ロール検出を使用して、次のようにチャネルを作成します。
#region Channel
protected String roleName;
protected String serviceName;
protected String endpointName;
protected String protocol = @"http";
protected EndpointAddress _endpointAddress;
protected BasicHttpBinding httpBinding;
protected NetTcpBinding tcpBinding;
protected IChannelFactory channelFactory;
protected T client;
protected virtual AddressHeader[] addressHeaders
{
get
{
return null;
}
}
protected virtual EndpointAddress endpointAddress
{
get
{
if (_endpointAddress == null)
{
var endpoints = RoleEnvironment.Roles[roleName].Instances.Select(i => i.InstanceEndpoints[endpointName]).ToArray();
var endpointIP = endpoints.FirstOrDefault().IPEndpoint;
if(addressHeaders != null)
{
_endpointAddress = new EndpointAddress(new Uri(String.Format("{1}://{0}/{2}", endpointIP, protocol, serviceName)), addressHeaders);
}
else
{
_endpointAddress = new EndpointAddress(String.Format("{1}://{0}/{2}", endpointIP, protocol, serviceName));
}
}
return _endpointAddress;
}
}
protected virtual Binding binding
{
get
{
switch (protocol)
{
case "tcp.ip":
if (tcpBinding == null) tcpBinding = new NetTcpBinding();
return tcpBinding;
default:
//http
if (httpBinding == null) httpBinding = new BasicHttpBinding();
return httpBinding;
}
}
}
public virtual T Client
{
get
{
if (this.client == null)
{
this.channelFactory = new ChannelFactory<T>(binding, endpointAddress);
this.client = ((ChannelFactory<T>)channelFactory).CreateChannel();
((IContextChannel)client).OperationTimeout = TimeSpan.FromMinutes(2);
var scope = new OperationContextScope(((IContextChannel)client));
addCustomMessageHeaders(scope);
}
return this.client;
}
}
#endregion
派生クラスでは、次の変数を渡します (たとえば)。
this.roleName = "WebServiceRole";
this.endpointName = "HttpInternal";
this.serviceName = "services/Accounts.svc";
ステージング (または本番) URL を参照する必要はまったくありません。
詳細については、こちらの回答を参照してください:サービス参照を追加せずに、同じソリューション内に WCF 参照を追加する
GUID を予測したり、制御したり、定数名を使用したりする方法はありません。
簡単にするためにできることは、URL を .CSCFG に移動し、Azure 管理ポータルから WCF サービスの URL を更新することです。