Моя служба WCF возвращает результат при вызове из клиентского приложения консоли. Тем не менее, он показывает
Исключение: невозможно подключиться к удаленному серверу
Фактическая ошибка:
Не удалось вызвать службу. Возможные причины: услуга недоступна или недоступна; конфигурация клиентской стороны не соответствует прокси; существующий прокси недействителен. Обратитесь к трассировке стека для более детально. Вы можете попробовать восстановить, запустив новый прокси-сервер, восстановив к конфигурации по умолчанию или обновлению службы.
Сведения об ошибке:
Сервер не смог обработать запрос из-за внутренней ошибки. Для получения дополнительной информации об ошибке, включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute или из поведения конфигурации) на сервере в чтобы отправить информацию об исключении обратно клиенту или включить отслеживание в соответствии с документацией Microsoft.NET Framework SDK и проверьте журналы трассировки сервера.
Трассировка стека сервера: at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message ответ, ошибка MessageFault, действие String, версия MessageVersion, FaultConverter faultConverter) при System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime операции, ProxyRpc & rpc) при System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, операция ProxyOperationRuntime, Object [] ins, Объект [], тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage методCall, ProxyOperationRuntime) при System.ServiceModel.Channels.ServiceChannelProxy.Invoke(Шеззаде сообщение)
Исключение, сброшенное в [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(Шеззаде reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & msgData, Int32) в IJiraService.GetProjects() в JiraServiceClient.GetProjects()
Обратите внимание, что когда Fiddler запущен, служба работает нормально. Однако, если я закрою Fiddler, тогда он показывает исключение:
Это журнал Fiddler (пока я получаю данные):
TTP/1.1 200 Соединение установлено Дата: Чт, 06 авг. 2015 14:39:22 GMT Прокси-соединение: Keep-Alive Через: 1.1 localhost.localdomain
Шифрование трафика HTTPS через этот туннель CONNECT. Расшифровка HTTPS включена в Fiddler, поэтому расшифрованные сеансы, запущенные в этом туннеле, будут показаны в списке веб-сеансов.
Защищенный протокол: Tls Шифр: Aes128 128 бит Алгоритм Хэша: Sha1 160bits Обмен ключами: ECDHE_RSA (0xae06) 256 бит.
== Сертификат сервера ========== [Предмет] CN = *. Atlassian.net, O = "Atlassian Network Services, Inc.", L = Сан-Франциско, S = Калифорния, C = US
[Эмитент] CN = DigiCert SHA2 High Assurance Server CA, OU = www.digicert.com, O = DigiCert Inc, C = US
[Серийный номер] 08E828A2F8C521A2DC7121A28E191837
[Не до] 9/9/2014 5:30:00 AM
[Не после] 15.11.2017 5:30:00 PM
[Отпечаток] EA57BE3C6CDA33E6D875889944EE61284E39D91D
HTTP/1.1 200 OK Сервер: nginx Дата: Чт, 06 авг. 2015 14:39:26 GMT Content-Type: application/json; charset = UTF-8 Передача-кодирование: chunked Подключение: сохранить жизнь Vary: Accept-Encoding X-AREQUESTID: 39x4118x1 X-ASEN: SEN-2425233 Set-Cookie: JSESSIONID = 8B68E46928883CA9F99382A67C228541; Path =/; Безопасный; HttpOnly Set-Cookie: studio.crowd.tokenkey = ""; Домен =.clientname.atlassian.net; Expires = Thu, 01-Jan-1970 00:00:10 GMT; Path =/; Безопасный; HttpOnly X-Seraph-LoginReason: OUT Set-Cookie: studio.crowd.tokenkey = YcO0N1IItmmGYah6bzgN0w00; Домен =.clientname.atlassian.net; Path =/; Безопасный; HttpOnly X-Seraph-LoginReason: OK Set-Cookie: atlassian.xsrf.token = ALMX-0SVV-VVCK-3Y73 | c420e5bfab5c997ccdfa21ffa129d60a69af0013 | lin; Path =/; Безопасный X-ASESSIONID: b2v6it X-AUSERNAME: admin X-ATENANT-ID: clientname.atlassian.net Cache-Control: no-cache, no-store, no-transform Параметры X-Content-Type: nosniff Strict-Transport-Security: max-age = 315360000; includeSubDomains
Как указано выше, журнал Fiddler - это что-то, что я должен изменить в файле web.config, чтобы он работал?
при вызове из тестового клиента WCF. Вот что я пробовал:
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>
Вот как я запрашиваю в своем коде:
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);
}
}
Вот моя подпись метода:
[ServiceContract]
public interface IService
{
[OperationContract]
List<ProjectDescription> GetProjects();
}
Примечание: "метод" вызывается из "GetProjects"
Это внутреннее исключение, которое я получаю при отладке, вызывая тестовый клиент WCF:
Это я получаю внутреннее исключение
Не удалось выполнить попытку подключения, потому что связанная сторона не ответила должным образом через некоторое время или не удалось установить соединение, потому что подключенный хост не смог ответить 165.254.xxx.xxx:443
ПРИМЕЧАНИЕ. Исключение отладки отсутствует, когда я отлаживаю консольное приложение. как я уже сказал, консольное приложение работает нормально, и я могу вернуть результат из службы.
ОБНОВЛЕНИЕ:. Когда я добавляю эту службу в консольное приложение как "Добавить ссылку", она работает нормально. Однако, когда я добавляю "Добавить служебную ссылку" в том же консольном приложении, он показывает мне ту же ошибку. Это моя сеть что-то блокирует? Пожалуйста, помогите.
Как это исправить? Есть ли что-то еще, что мне нужно добавить в web.config
? ИЛИ мне нужно разрешить URL-адрес как доверенный URL-адрес где-нибудь?