Позвольте мне начать с того, что я впервые работаю с веб-сервисами WCF, и последние 3 дня я боролся с ошибкой. На эти вопросы много раз отвечали в Stackoverflow, однако я пробовал большинство решений и пока не добился успеха, поэтому мне нужна помощь в определении правильного пути.
Теперь немного предыстории. Я создаю проект 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>
And I'm trying to consume the web service in the client using the following code:
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();
}
}
}
Для привязки клиента я пробовал и BasicHttp, и NetTCP (в качестве CustomBinding), что приводило к некоторым ошибкам. Когда я создаю привязку BasicHttp, я использую следующую конфигурацию ссылки на службу:
и после запуска этой конфигурации я получаю сообщение об ошибке «Доступ запрещен. Сведения об исключении: System.ServiceModel.Security.SecurityAccessDeniedException: Доступ запрещен».
А для привязки nettcp, когда я пытаюсь создать ссылку на службу, я получаю сообщение об ошибке «Префикс URI не распознан. Метаданные содержат ссылку, которую невозможно разрешить: net.tcp://localhost/ERP100700/Ice/ BO/Company.svc». Я пытался использовать в URL-адресе как localhost, так и pilotserver.
Я пытался запустить приложение как в режиме отладки (ISS-Express), так и опубликовать его в IIS, но результат тот же. Что я делаю не так и как решить эту проблему?
net.tcp
, вы делаете это черезhttp
. Пока конфигурация службы правильно отображает конечную точкуnet.tcp
, вы сможете использовать ее на основе WSDL, извлеченного из файлаhttp
. Нет необходимости добавлять ссылку второй раз дляnet.tcp
. - person R. Richards   schedule 10.07.2016