Il servizio WCF restituisce il risultato quando si chiama dal client dell'applicazione console. Tuttavia, è mostrandoAggiungi riferimento servizio fornisce Eccezione: impossibile connettersi al server remoto
Exception: Unable to connect to remote server
errore effettivo:
Failed to invoke the service. Possible causes: The service is offline or inaccessible; the client-side configuration does not match the proxy; the existing proxy is invalid. Refer to the stack trace for more detail. You can try to recover by starting a new proxy, restoring to default configuration, or refreshing the service.
Dettagli errore:
The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.
Server stack trace: at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at IJiraService.GetProjects() at JiraServiceClient.GetProjects()
prega di notare che, quando Fiddler è in esecuzione, il servizio sta funzionando fine.However, se chiudo Fiddler, viene visualizzata un'eccezione:
Si tratta di registro Fiddler (mentre sto ottenendo i dati):
TTP/1.1 200 connessione stabilita Data: Giovedì, 6 agosto 2015 14:39:22 GMT Proxy-Connection: Keep-Alive Via : 1.1 localhost.localdomain
Il traffico HTTPS crittografato scorre attraverso questo tunnel CONNECT. La decrittografia HTTPS è abilitata in Fiddler, quindi le sessioni decrittografate in esecuzione in questo tunnel verranno visualizzate nell'elenco Sessioni Web.
Protocol Secure: Tls Cipher: AES128 128bits Hash Algorithm: SHA1 160bits Key Exchange: ECDHE_RSA (0xae06) 256bits
== Certificate Server ========== [Soggetto] CN = *. atlassian.net, O = "Atlassian Network Services, Inc.", L = San Francisco, S = California, C = US
[Emittente] CN = DigiCert SHA2 alta Assurance Server CA, OU = www.digicert.com, O = DigiCert Inc, C = US
[Numero di serie] 08E828A2F8C521A2DC7121A28E191837
[Non prima] 2014/09/09 05:30:00
[Non dopo] 2017/11/15 17:30:00
[Identificazione] EA57BE3C6CDA33E6D875889944EE61284E39D91D
HTTP/1.1 200 OK Server : nginx Dat e: gio, 6 agosto 2015 14:39:26 GMT Content-Type: application/json; charset = UTF-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding X-AREQUESTID: 39x4118x1 X-ASEN: SEN-2425233 Set-Cookie: JSESSIONID = 8B68E46928883CA9F99382A67C228541; Path = /; Sicuro; HttpOnly Set-Cookie: studio.crowd.tokenkey = ""; Dominio = .clientname.atlassian.net; Scadenza = Gio, 01-Jan-1970 00:00:10 GMT; Path = /; Sicuro; HttpSolo X-Seraph-LoginMotore: OUT Set-Cookie: studio.crowd.tokenkey = YcO0N1IItmmGYah6bzgN0w00; Dominio = .clientname.atlassian.net; Path = /; Sicuro; HttpSolo X-Seraph-LoginMotore: OK Set-Cookie: atlassian.xsrf.Token = ALMX-0SVV-VVCK-3Y73 | c420e5bfab5c997ccdfa21ffa129d60a69af0013 | lin; Path = /; Fissare X-ASESSIONID: b2v6it X-AUSERNAME: admin X-Atenant-ID: clientname.atlassian.net Cache-Control: no-cache, no-store, no-transform X-Content-Type-Options: NOSNIFF Strict-Transport-Security: max-age = 315.360.000; includeSubDomains
Come al precedente registro Fiddler è qualcosa che devo cambiare nel file web.config per farlo funzionare?
quando chiamato dal client di prova WCF. Ecco quello che ho provato:
web.config:
<?xml version="1.0"?>
<configuration>
<!--<system.net>
<defaultProxy useDefaultCredentials="true" >
</defaultProxy>
</system.net>-->
<appSettings>
<add key="UserName" value="admin"/>
<add key="Password" value="admin"/>
<add key="resturl" value="https://Clientname.atlassian.net/rest/api/2/"/>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IJiraService"/>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:19065/JiraService.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IJiraService" contract="ServiceReference1.IJiraService"
name="BasicHttpBinding_IJiraService" />
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
Ecco come sto richiedente mio codice:
public class Service : IService
{
private string GetRestURL()
{
return System.Configuration.ConfigurationManager.AppSettings["resturl"];
}
private string GetUserName()
{
return System.Configuration.ConfigurationManager.AppSettings["MyUserName"];
}
private string GetPassword()
{
return System.Configuration.ConfigurationManager.AppSettings["MyPassword"];
}
public string method()
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
// HttpClient
request.ContentType = "application/json; charset=UTF-8";
//request.ContentType = "text/xml; charset=UTF-8";
/*request.Headers.Add("X-Atlassian-Token", "nocheck");
request.UseDefaultCredentials = true;
request.KeepAlive = true;*/
request.Method = method;
/*if (data != null)
{
using (StreamWriter writer = new StreamWriter(request.GetRequestStream(),Encoding.ASCII))
{
writer.Write(data);
}
}*/
string base64Credentials = GetEncodedCredentials();
request.Headers.Add("Authorization", "Basic " + base64Credentials);
try
{
request.Headers.Add("Authorization", "Basic " + base64Credentials);
response = request.GetResponse() as HttpWebResponse; //here its NULL
if (response.StatusCode != HttpStatusCode.OK)
{
throw new Exception(String.Format("Server error (HTTP {0}:{1}).",response.StatusCode,response.StatusDescription));
}
}
catch (Exception ex) //Here I'm getting exception
{
throw new Exception(ex.Message);
}
}
Ecco il mio metodo di firma:
[ServiceContract]
public interface IService
{
[OperationContract]
List<ProjectDescription> GetProjects();
}
Nota: il "metodo" viene chiamato da "GetProjects"
questa è l'eccezione interna sto ottenendo durante il debug invocando client di prova WCF:
Questo è Sto diventando eccezione interna
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 165.254.xxx.xxx:443
NOTA: Non c'è eccezione di debug quando sto debug dall'applicazione console. come ho detto, l'applicazione della console funziona correttamente e sono in grado di restituire il risultato dal servizio.
AGGIORNAMENTO: Quando aggiungo questo servizio nell'applicazione console come "Aggiungi riferimento", funziona correttamente. Tuttavia, quando aggiungo come "Aggiungi riferimento servizio" nella stessa applicazione console, viene visualizzato lo stesso errore. La mia rete sta bloccando qualcosa? Per favore aiuto.
Come correggere questo? C'è qualcos'altro che devo aggiungere in web.config
? O devo consentire l'URL come URL fidato da qualche parte?
puoi mostrarci la firma del tuo metodo di servizio 'REST'? –
Aggiornato la mia domanda con la firma. – AskMe
Se ho capito bene - hai impostato la connessione http, non lo sono? Ma dal messaggio di errore vedo che ti stai collegando alla porta https (443). Potrebbe essere il tuo problema? – RredCat