Ho due ruoli Web e uno di loro esegue il livello di servizio costituito da 3 servizi WCF connessi a net.tcp, ciascuno distribuito come sito Web sulla porta 808, 810 e 811.L'endpoint interno per il servizio WCF non funziona sul ruolo Web di Azure
Ora voglio che il livello di servizio sia aperto solo al mio altro ruolo web.
Così ho cercato di rendere interno uno degli endpoint dei servizi e di dare accesso al mio ruolo web frontale.
Ti piace questa:
<ServiceDefinition name="MagnusAzureCloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6"> <WebRole name="Core.Services" vmsize="Small"> <Runtime executionContext="elevated" /> <Startup> <Task commandLine="Startup/startup.cmd" executionContext="elevated" taskType="background" /> </Startup> <Sites> <Site name="Core" physicalDirectory="C:\CoreServices"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> <Site name="Store" physicalDirectory="C:\StoreServices"> <Bindings> <Binding name="Endpoint3" endpointName="Endpoint3" /> </Bindings> </Site> <Site name="Users" physicalDirectory="C:\UserServices"> <Bindings> <Binding name="Endpoint4" endpointName="Endpoint4" /> </Bindings> </Site> </Sites> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" /> </ConfigurationSettings> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="8282" /> <InputEndpoint name="Endpoint3" protocol="http" port="81" /> <InputEndpoint name="Endpoint4" protocol="http" port="8181" /> <InputEndpoint name="Endpoint2" protocol="tcp" port="808" localPort="808" /> <InputEndpoint name="Endpoint5" protocol="tcp" port="810" localPort="810" /> <InternalEndpoint name="Endpoint6" protocol="tcp" port="811" /> </Endpoints> <Certificates> </Certificates> <Imports> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> </WebRole> <WebRole name="UIWeb" vmsize="Small"> <Runtime executionContext="elevated" /> <Startup> <Task commandLine="Startup/startup.cmd" executionContext="elevated" taskType="background" /> </Startup> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" /> </ConfigurationSettings> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="RemoteAccess" /> </Imports> </WebRole> <NetworkTrafficRules> <OnlyAllowTrafficTo> <Destinations> <RoleEndpoint endpointName="Endpoint6" roleName="Core.Services" /> </Destinations> <WhenSource matches="AnyRule"> <FromRole roleName="UIWeb"/> </WhenSource> </OnlyAllowTrafficTo> </NetworkTrafficRules> </ServiceDefinition>
Ma quando l'UserService si tenta sembra timeout.
Errore server nell'applicazione '/'.
Connessione a via net.tcp: //myservicename.cloudapp.net: 811/UserTypeService.svc scaduta dopo 00:00:00. Sono stati effettuati tentativi di connessione a 0 di 1 indirizzi disponibili (). Controlla il RemoteAddress del tuo canale e verifica che i record DNS per questo endpoint corrispondano a indirizzi IP validi. Il tempo assegnato a questa operazione potrebbe essere una parte di un timeout più lungo di .
Ho anche provato a impostare <AllowAllTraffic/>
anziché <WhenSource ...>
ma ciò non ha alcun effetto.
Secondo tentativo: Dopo un feedback Ho provato alcune varianti per impostare un FixedPort
e PortRange
a 811 e il ruolo ascoltando port="*"
.
<InternalEndpoint name="Endpoint6" protocol="tcp" port="*" >
<FixedPortRange min="811" max="811"></FixedPortRange>
</InternalEndpoint>
Ho mantenuto il NetworkTrafficRules come nei tentativi precedenti.
Ho anche aggiunto il seguente codice per assicurarmi che ci sia un listener per una porta dinamica. Nel mio file WebRole.cs:
public class WebRole : RoleEntryPoint
{
/// <summary>
///
/// </summary>
/// <returns></returns>
public override bool OnStart()
{
Trace.TraceInformation("OnStart method called. Updating information on IIS.");
try
{
// Initialize method-wide variables
var epName = "Endpoint6";
var roleInstance = RoleEnvironment.CurrentRoleInstance;
// Identify direct communication port
var myPublicEp = roleInstance.InstanceEndpoints[epName].PublicIPEndpoint;
Trace.TraceInformation("IP:{0}, Port:{1}", myPublicEp.Address, myPublicEp.Port);
// Identify public endpoint
var myInternalEp = roleInstance.InstanceEndpoints[epName].IPEndpoint;
// Create socket listener
var listener = new Socket(
myInternalEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// Bind socket listener to internal endpoint and listen
listener.Bind(myInternalEp);
listener.Listen(10);
Trace.TraceInformation("Listening on IP:{0},Port: {1}",
myInternalEp.Address, myInternalEp.Port);
while (true)
{
// Block the thread and wait for a client request
Socket handler = listener.Accept();
Trace.TraceInformation("Client request received.");
// Define body of socket handler
var handlerThread = new Thread(
new ParameterizedThreadStart(h =>
{
var socket = h as Socket;
Trace.TraceInformation("Local:{0} Remote{1}",
socket.LocalEndPoint, socket.RemoteEndPoint);
// Shut down and close socket
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
));
// Start socket handler on new thread
handlerThread.Start(handler);
}
}
catch (Exception e)
{
Trace.TraceError("Caught exception in run. Details: {0}", e);
}
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
return base.OnStart();
}
}
Un'altra nota è che il servizio di chiamate utilizza la porta 811 per trovare il giusto servizio in quanto il servizio viene eseguito tre diversi siti del progetto WCF. E il servizio che sto chiamando usa anche un numero di porta specifico che, a mio avviso, può essere un problema se dovesse essere improvvisamente dinamico. Il servizio di chiamate è simile al seguente:
<endpoint address="net.tcp://myservicename.cloudapp.net:811/UserTypeService.svc"
behaviorConfiguration="ClientContextEndpointBehavior" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_FrameworkService" contract="Users.Services.IPersonTypeService"
name="Tcp">
<identity>
<dns value="The Certificate Name" />
</identity>
</endpoint>
e sul ricevente siti (interno) WebRole ho i seguenti tipi di configurazioni.
<service name="Core.Services.Logging.LoggingService" behaviorConfiguration="coreServiceBehavior">
<endpoint address="net.tcp://localhost:808/LoggingService.svc"
behaviorConfiguration="ContextEndpointBehavior"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding1"
contract="Core.Logging.ILoggingService">
<identity>
<dns value="The Certificate Name" />
</identity>
</endpoint>
E l'altro sito della WCF sulla porta 811:
<service name="Users.Services.PersonTypeService">
<endpoint address="net.tcp://localhost:811/UserTypeService.svc" binding="netTcpBinding" bindingConfiguration="NetTcpServiceBinding1" behaviorConfiguration="ServerContextEndpointBehavior" contract="Users.Services.IUserTypeService">
<identity>
<dns value="The Certificate Name" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" kind="mexEndpoint">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
Non sono sicuro che sto seguendo?Che cosa suggerisci che io faccia e perché? –
@MagnusKarlsson Si sta tentando di connettersi a un endpoint _internal_ utilizzando * l'indirizzo * * myservicename.cloudapp.net al proprio servizio, _Intestati endpoint_ vengono utilizzati per comunicare con le istanze del ruolo da * outside * di Azure. _Interno endpoint_ vengono utilizzati per la comunicazione di ruolo * interna * e quindi sono necessari gli indirizzi IP per l'intervallo IP interno, che è quello che fa il mio esempio codificato. Vedere questo per ulteriori informazioni https://msdn.microsoft.com/en-us/library /azure/hh180158.aspx –
Penso che il DNS interno di Azure gestirà il mio indirizzo del servizio cloud e lo risolverò nell'indirizzo IP corretto. Dal momento che i due ruoli sono all'interno dello stesso servizio cloud, dovrebbero essere in grado di parlare tra loro senza un lavoro in giro? Ho appena aggiunto una porta fissa come da questo esempio e proveremo ora. O mi sta sfuggendo qualcosa? https://msdn.microsoft.com/en-us/library/azure/hh180158.aspx –