2016-07-10 28 views
0

Lassen Sie mich damit beginnen, dass ich zum ersten Mal mit den WCF-Webdiensten arbeite und in den letzten drei Tagen Fehler bekämpft habe. Diese Probleme wurden bei Stackoverflow oft beantwortet, aber ich habe die meisten Lösungen ausprobiert und war noch nicht erfolgreich, also brauche ich Hilfe bei der richtigen Entscheidung.WCF Webservice Connection Problem

Jetzt einige Hintergrund. Ich erstelle ein ASP.Net MVC 5-Projekt, ich muss eine Verbindung zu WCF-Webdiensten herstellen, die von Epicor (einer ERP-Lösung) bereitgestellt werden. Mein Projekt, das ERP und seine Webdienste werden alle auf einer internen IIS-Instanz gehostet. Die Dienste werden mithilfe von BasicHTTP- und NetTCP-Protokollen bereitgestellt. Der Anwendungspool, auf dem der Web-Service und das ERP gehostet werden, verwendet die Identität. Einer der Webservice Company.svc genannt und es wird als ausgesetzt:

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

In meinem Projekt hat mein web.config folgendes:

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

Und ich m versucht, den Web-Service im Client mit folgendem Code zu konsumieren:

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(); 
     } 
    } 
} 

Für den Client b Ich habe sowohl BasicHttp als auch NetTCP (als CustomBinding) ausprobiert, was zu einigen Fehlern führte. Wenn ich eine BasicHttp Bindung erstellen, verwende ich die folgende Service-Referenzkonfiguration:

BasicHttpBinding

und auf diese Konfiguration ausgeführt wird, ich einen Fehler für „Zugang erhalten verweigert Ausnahmedetails:. System.ServiceModel.Security.SecurityAccessDeniedException : Zugriff wurde verweigert. "

BasicHttp Error

Und für NetTcp Bindung, wenn ich versuche, einen Dienstverweis zu erstellen, erhalte ich einen Fehler mit der Meldung „Der URI-Präfix nicht erkannt wird Metadaten eine Referenz enthält, die nicht gelöst werden können. Net.tcp :. //localhost/ERP100700/Ice/BO/Company.svc‘ich habe versucht, in der uRL

NetTcp Error

ich im Debug-Modus, um die Anwendung ausgeführt haben sowohl localhost und pilotserver versucht mit beiden (. ISS-Express) und die Veröffentlichung in IIS, aber das gleiche Ergebnis Was mache ich falsch und wie kann ich beheben Sie dieses Problem?

+0

Es könnte schwierig sein, das Netz zu generieren.TCP-Client-Code und Verträge so. Versuchen Sie, den Schnittstellenvertrag und seine abhängigen Datenverträge auf die Clientanwendung zu kopieren, und verwenden Sie die ChannelFactory, um einen net.tcp-Proxy für Sie zu erstellen. Was die BasicHttp-Version betrifft, müssten Sie diese Anfrage erfassen und sehen, welche Art von Information an den Service weitergegeben wird, der sagt, dass Sie nicht autorisiert sind. Sie können Fiddler, WCF Tracing oder sogar (und ich empfehle es) Wireshark, dies zu tun. –

+0

Einige der Sachen, die ich erwähnt habe, gehen davon aus, dass du die Grundlagen kennst, und ich werde sie nicht erklären. Es gibt viele Google-Tutorials und Dokumentation, die es gibt. –

+0

FYI, Sie können keine Service-Referenz mit dem 'net.tcp'-Protokoll hinzufügen, Sie tun es über' http'. Solange die Service-Konfiguration den 'net.tcp'-Endpunkt korrekt verfügbar macht, sollten Sie in der Lage sein, ihn basierend auf der WSDL zu verwenden, die aus dem' http' herausgezogen wird. Es ist nicht nötig, die Referenz ein zweites Mal für 'net.tcp' hinzuzufügen. –

Antwort

0

Der Grund, warum ich alle diese Fehler erhielt, war, dass in Web.config für Epicor Webdienste (in IIS) HTTPS-Schema für BasicHTTP deaktiviert/Kommentar aus war. Ich musste folgendes hinzufügen, damit meine Bewerbung funktioniert.

Dies ist das Standardverhalten in Epicor.

0

Im HomeController, so scheint es, dass diese

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

etwas sein sollte wie folgt

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

Sie den Benutzernamen zweimal im Code vorbei, wie Sie es präsentieren.

+0

Ich kann diesen Tippfehler nicht glauben. Danke, dass Sie das bemerkt haben. Der Fehler ist jedoch immer noch derselbe. Nochmals vielen Dank dafür. – SJaka

+0

Erhalten Sie immer noch den Fehler Zugriff verweigert, wenn Sie den HTTP-Client ('BasicHttpBinding_CompanySvcContract') verwenden, nachdem Sie das Kennwort ordnungsgemäß gesendet haben? –

+0

Ja, derselbe Fehler. Wahrscheinlich ist die Frage, die Sie an dieser Stelle stellen müssen, wie man die Zugangsdaten in webconfig und/oder Client-Code richtig setzt? Ich habe sowohl 'CompanyService.ClientCredentials.UserName.UserName/Password' und 'CompanyService.ChannelFactory.Credentials.UserName.UserName/Passowrd' Kombinationen ausprobiert. Auch in Windows Eventviewer habe ich festgestellt, dass ich eine 'Service Autorisierung fehlgeschlagen' Fehler mit einer leeren Client-Identität 'ClientIdentity:'. – SJaka