2016-07-10 4 views
0

Позвольте мне начать с того, что это мой первый опыт работы с веб-службами WCF, и я боролся с ошибкой в ​​течение последних 3 дней. Эти проблемы неоднократно отвечали на Stackoverflow, однако я пробовал большинство решений и еще не добился успеха, поэтому мне нужна помощь в правильном выборе.Вопрос о подключении WCF Webservice

Теперь некоторые фоне. Я создаю проект ASP.Net MVC 5, я должен подключиться к веб-сервисам WCF, предоставляемым Epicor (решение ERP). Мой проект, ERP и его веб-службы размещены на внутреннем экземпляре IIS. Сервисы предоставляются с использованием протоколов BasicHTTP и NetTCP. Пул приложений, на котором размещаются веб-служба и ERP, использует идентификатор. Один из веб-службы называется Company.svc и она подвергается как:

<wsdl:service name="CompanySvcFacade"> 
    <wsdl:port name="BasicHttpBinding_CompanySvcContract" binding="tns:BasicHttpBinding_CompanySvcContract"> 
     <soap:address location="http://pilotserver/ERP100700/Ice/BO/Company.svc"/> 
    </wsdl:port> 
    <wsdl:port name="CustomBinding_CompanySvcContract" binding="tns:CustomBinding_CompanySvcContract"> 
     <soap12:address location="net.tcp://pilotserver/ERP100700/Ice/BO/Company.svc"/> 
     <wsa10:EndpointReference> 
      <wsa10:Address>net.tcp://pilotserver/ERP100700/Ice/BO/Company.svc</wsa10:Address> 
      <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity"> 
       <Upn>pilotserver\Administrator</Upn> 
      </Identity> 
     </wsa10:EndpointReference> 
    </wsdl:port> 
</wsdl:service> 

В моем проекте, мой web.config имеет следующее:

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_CompanySvcContract" /> 
    </basicHttpBinding> 
    <customBinding> 
    <binding name="CustomBinding_CompanySvcContract"> 
     <security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport" 
     requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"> 
     <localClientSettings detectReplays="false" /> 
     <localServiceSettings detectReplays="false" /> 
     </security> 
     <textMessageEncoding /> 
     <windowsStreamSecurity /> 
     <tcpTransport /> 
    </binding> 
    </customBinding> 
</bindings> 
<client> 
    <endpoint address="http://pilotserver/ERP100700/Ice/BO/Company.svc" 
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_CompanySvcContract" 
    contract="CompanyService.CompanySvcContract" name="BasicHttpBinding_CompanySvcContract" /> 
    <endpoint address="net.tcp://pilotserver/ERP100700/Ice/BO/Company.svc" 
    binding="customBinding" bindingConfiguration="CustomBinding_CompanySvcContract" 
    contract="CompanyService.CompanySvcContract" name="CustomBinding_CompanySvcContract"> 
    <identity> 
     <userPrincipalName value="pilotserver\Administrator" /> 
    </identity> 
    </endpoint> 
</client> 

И я m пытается использовать веб-службу в клиенте, используя следующий код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 
using System.ServiceModel.Description; 
using System.ServiceModel.Dispatcher; 
using EpicorTestApp.CompanyService; 
using NLog; 
namespace EpicorTestApp.Controllers 
{ 
    public class HomeController : Controller 
    { 
     CompanySvcContractClient CompanyService = new CompanySvcContractClient("CustomBinding_CompanySvcContract"); 
     //CompanySvcContractClient CompanyService = new CompanySvcContractClient("BasicHttpBinding_CompanySvcContract"); 
     private Logger logger = LogManager.GetCurrentClassLogger(); 
     public ActionResult Index() 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 
      bool morePages = false; 

      CompanyService.ClientCredentials.UserName.UserName = "Administrator"; 
      CompanyService.ClientCredentials.UserName.UserName = "myPassword"; 
      CompanyListTableset companyList = CompanyService.GetList("", 0, 0, out morePages); 
      CompanyListTable companies = companyList.CompanyList; 
      foreach (CompanyListRow companyListRow in companies) 
      { 
       logger.Info("Company: " + companyListRow.Company); 
      }   
      return View(); 
     } 
    } 
} 

Для клиента b inding, я пробовал как BasicHttp, так и NetTCP (как CustomBinding), оба приводят к некоторым ошибкам. Когда я создаю BasicHttp связывание, я использую следующий ссылочный службы конфигурации:

BasicHttpBinding

и после запуска этой конфигурации, я получаю сообщение об ошибке для «Доступ запрещен Сведения об исключении:. System.ServiceModel.Security.SecurityAccessDeniedException : В доступе отказано."

BasicHttp Error

И для nettcp связывания, когда я пытаюсь создать ссылку на службу, я получаю сообщение об ошибке с сообщением «Префикс URI не распознается метаданные содержит ссылку, которая не может быть решена:. Net.Tcp :. //localhost/ERP100700/Ice/BO/Company.svc»Я пытался использовать как локальный и pilotserver в URL

NetTcp Error

Я попытался запустить приложение как в режиме отладки (. ISS-Express) и опубликовать его в IIS, но тот же результат. Что я делаю неправильно и как могу решить эту проблему?

+0

Это может быть сложно создать сеть.клиентский код tcp и такие контракты. Поскольку он находится на вашем локальном ПК, попробуйте скопировать Контракт интерфейса и его зависимые Контракты данных в клиентское приложение и использовать ChannelFactory для создания прокси-сервера net.tcp для вас. Что касается BasicHttp one, вам нужно будет захватить этот запрос и посмотреть, какая информация передается службе, которая говорит, что вы не авторизованы. Вы можете использовать Fiddler, WCF Tracing или даже (и я настоятельно рекомендую) Wireshark сделать это. –

+0

Некоторые из материалов, о которых я упомянул, предполагают, что вы знаете основы, и я не буду их объяснять, есть много учебных пособий и документации Google, которые там будут. –

+0

FYI, вы не можете добавить ссылку на службу, используя протокол 'net.tcp', вы делаете это через' http'. Пока конфигурация сервиса корректно предоставляет конечную точку 'net.tcp', вы можете использовать ее на основе WSDL, вытащенного из' http'. Не нужно добавлять ссылку во второй раз для 'net.tcp'. –

ответ

0

Причина, по которой я получал все эти ошибки, заключалась в том, что в Web.config для веб-служб Epicor (внутри IIS) схема https для BasicHTTP была отключена/отключена. Мне пришлось добавить следующее, чтобы приложение работало.

Это поведение по умолчанию в Epicor.

0

В HomeController, казалось бы, что это

CompanyService.ClientCredentials.UserName.UserName = "Administrator"; 
CompanyService.ClientCredentials.UserName.UserName = "myPassword"; 

Должно быть что-то вроде этого

CompanyService.ClientCredentials.UserName.UserName = "Administrator"; 
CompanyService.ClientCredentials.UserName.Password = "myPassword 

Вы пропусканием UserName дважды в коде, как вы представить его.

+0

Я не могу поверить в эту опечатку. Спасибо, что заметили это. Однако ошибка остается прежней. Еще раз спасибо за это. – SJaka

+0

Вы по-прежнему получаете отказ в доступе при использовании HTTP ('BasicHttpBinding_CompanySvcContract') клиента после правильной отправки пароля? –

+0

Да, та же ошибка. Вероятно, на данный момент возникает вопрос, как правильно настроить учетные данные в Webconfig и/или клиентском коде? Я попробовал как «CompanyService.ClientCredentials.UserName.UserName/Password», так и «CompanyService.ChannelFactory.Credentials.UserName.UserName/Passowrd». Кроме того, в windows eventviewer я заметил, что я получаю ошибку «Ошибка авторизации службы» с пустым идентификатором клиента «ClientIdentity:». – SJaka