2016-07-10 4 views
0

WCF 웹 서비스를 처음 사용하는 것으로 시작하여 지난 3 일 동안 오류를 저지른 것으로 시작하겠습니다. 이러한 문제는 Stackoverflow에서 여러 번 답변을 받았지만 대부분의 솔루션을 시도했지만 아직 성공하지 못했습니다. 따라서 올바른 방법을 찾는 데 도움이 필요합니다.WCF 웹 서비스 연결 문제

이제 일부 배경. 저는 ASP.Net MVC 5 프로젝트를 만들고 있는데, 저는 Epicor (ERP 솔루션)에서 제공하는 WCF 웹 서비스에 연결해야합니다. 내 프로젝트 인 ERP와 웹 서비스는 모두 내부 IIS 인스턴스에서 호스팅됩니다. 서비스는 BasicHTTP 및 NetTCP 프로토콜을 사용하여 노출됩니다. 웹 서비스 및 ERP가 호스팅되는 응용 프로그램 풀은 ID를 사용합니다. 웹 서비스의 하나가 Company.svc이라고하며이 같이 노출 :

<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> 

그리고 나 ': 내 프로젝트에서

<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의 다음과 같은있다 다음 코드를 사용하여 클라이언트의 웹 서비스를 사용하려고합니다 :

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과 같은)를 시도했는데, 둘 다 약간의 에러가 발생했다.

BasicHttpBinding

이 구성을 실행시

, 내가 거부 액세스 "에 대한 오류가 예외 정보를 : 나는 BasicHttp 바인딩을 작성하면, 다음과 같은 서비스 참조 구성을 사용합니다. System.ServiceModel.Security.SecurityAccessDeniedException을 : 접근이 금지되어있다."

BasicHttp Error

내가 서비스 참조를 만들려고 할 때, 바인딩 nettcp에 대한

, 나는 URI 접두사가 인식되지 않는 메시지 "로 오류가 발생 메타 데이터는 확인할 수없는 참조가 포함되어 있습니다. net.tcp를 :. //localhost/ERP100700/Ice/BO/Company.svc는 '나는 URL에 모두 로컬 호스트와 pilotserver 사용하려고했습니다

NetTcp Error

내가 디버그 모드에서 응용 프로그램을 모두 (실행 시도했습니다. ISS-Express)를 IIS에 게시하고 동일한 결과를 얻을 수 있습니다. 내가 잘못하고 있으며 어떻게해야합니까? 이 문제를 해결 하시겠습니까? HomeController에서

+0

그물을 생성하는 것이 까다로울 수 있습니다.tcp 클라이언트 코드와 계약서. 로컬 PC에 있기 때문에 인터페이스 계약 및 종속 데이터 계약을 클라이언트 응용 프로그램에 복사하고 ChannelFactory를 사용하여 net.tcp 프록시를 만듭니다. BasicHttp에 관해서는, 당신은 그 요청을 캡쳐하고 어떤 종류의 정보가 당신이 권한이 없다는 것을 말하고있는 서비스에 전달되는지를 볼 필요가 있습니다. Fiddler, WCF Tracing을 사용하거나 Wireshark를 사용해도 좋습니다. –

+0

내가 언급 한 것들 중 일부는 당신이 기본을 알고 있다고 가정하고, 나는 그들에 대해 설명하지 않을 것이다. 거기에는 많은 구글 튜토리얼과 문서가있다. –

+0

참고로, 'net.tcp' 프로토콜을 사용하여 서비스 참조를 추가 할 수 없습니다.'http'를 통해 서비스 참조를 할 수 있습니다. 서비스 설정이'net.tcp' 엔드 포인트를 적절하게 노출하는 한'http'에서 가져온 WSDL을 기반으로 사용할 수 있어야합니다. 'net.tcp'에 두 번째 참조를 추가 할 필요가 없습니다. –

답변

0

내가 이러한 모든 오류를 얻는 이유는 Epicor의 웹 서비스 (IIS 내부) 용 Web.config에서 BasicHTTP에 대한 https 체계가 비활성화/주석 처리 되었기 때문입니다. 신청서를 작성하려면 다음을 추가해야했습니다.

이것은 Epicor의 기본 동작입니다.

0

, 당신이 그것을 선물로이

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

당신은 코드에서 두 번 사용자 이름을 전달하는이

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

같은되어야 함을 보인다.

+0

이 오타를 믿을 수 없습니다. 이것을 발견해 주셔서 감사합니다. 그러나 오류는 여전히 동일합니다. 다시 한번 이것에 감사드립니다. – SJaka

+0

암호를 제대로 보낸 후에 HTTP ('BasicHttpBinding_CompanySvcContract') 클라이언트를 사용할 때 여전히 액세스 거부 오류가 발생합니까? –

+0

예, 같은 오류입니다. 아마 지금 질문 할 질문은 webconfig 및/또는 클라이언트 코드에서 자격 증명을 올바르게 설정하는 방법입니다. 'CompanyService.ClientCredentials.UserName.UserName/Password'및 'CompanyService.ChannelFactory.Credentials.UserName.UserName/Passowrd'조합을 모두 시도했습니다. 또한 Windows 이벤트 뷰어에서 빈 클라이언트 ID 'ClientIdentity :'에 '서비스 인증에 실패했습니다.'오류가 표시됩니다. – SJaka