2017-11-12 25 views
8

Tôi đã tạo dự án Xamarin.Forms với thư viện nhắm mục tiêu netstandard2.0 thay vì thư viện được chia sẻ hoặc PCL. Cho đến nay điều này biên dịch và hoạt động. Tôi đang sử dụng phiên bản up2date của Cộng đồng Visual Studio 2017.Tạo proxy máy khách WCF cho dự án Xamarin.Forms netstandard

Tôi cũng đã tạo một dịch vụ WCF sẽ được lưu trữ trên chính cửa sổ (không phải IIS). Tôi đã định cấu hình app.config của mình để cung cấp Điểm cuối trao đổi siêu dữ liệu:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <system.serviceModel> 
     <services> 
      <service behaviorConfiguration="MM.Server.ServiceServerBehavior" name="MM.Server.ServiceServer"> 
       <endpoint address="net.tcp://localhost:8730/MMServer/" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IServiceServer" bindingName="NetTcpBinding_IServiceServer_EndPoint" contract="MM.Contracts.IServiceServer"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="http://localhost:8731/MMServer/mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:8730/MMServer/"/> 
        </baseAddresses> 
       </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="MM.Server.ServiceServerBehavior"> 
        <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8731/MMServer/mex" /> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <bindings> 
      <netTcpBinding> 
       <binding name="NetTcpBinding_IServiceServer" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384"/> 
        <reliableSession ordered="true" inactivityTimeout="01:00:00" enabled="false"/> 
        <security mode="None"><!-- TODO: Add more security later --> 
         <transport clientCredentialType="None" protectionLevel="None"/> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
    </system.serviceModel> 
</configuration> 

Đây là cấu hình rất đơn giản và hiện tại tôi không quan tâm đến bảo mật. Dịch vụ này chạy thành công.

Bây giờ tôi không thể chỉ thêm một tham chiếu dịch vụ vào dự án Xamarin.Forms của tôi, vì netstandard không cung cấp System.ServiceModel.

Tôi đã phát hiện ra rằng I can use the SLsvcUtil.exe từ Silverlight SDK để tạo proxy máy khách cho dịch vụ WCF tương thích với Xamarin.Forms nhắm mục tiêu netstandard thay vào đó, tuy nhiên tôi không thể chạy nó.

Không có vấn đề làm thế nào tôi cố gắng sử dụng SLsvcUtil.exe trong khi dịch vụ WCF của tôi đang chạy, tôi luôn nhận được lỗi:

Error: An error occurred in the tool. 
Error: Object reference not set to an instance of an object. 

Dưới đây là hàng loạt của tôi mà tôi sử dụng để thực hiện SLsvcUtil.exe:

set "namespace=*,MM.Services" 
set "mexPath=http://localhost:8731/MM/mex" 
set "svcutil=C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\Tools\SLsvcUtil.exe" 
set "outputDir=C:\vsproj\Xamarin\MM\MM.App" 
"%svcutil%" %mexPath% /directory:"%outputDir%" /namespace:"%namespace%" 
pause 

http://localhost:8731/MM/mex trả về WSDL đầy đủ, thành công.

Tôi làm cách nào để có được proxy máy khách được tạo hoạt động cho ứng dụng Xamarin.Forms đang nhắm mục tiêu netstandard2.0? Tôi mở cho bất kỳ thay thế nào dẫn đến cùng một kết quả mong muốn.

+1

Bất kỳ lý do đặc biệt mà bạn chọn WCF qua sử dụng một Web API RESTful? – Nkosi

+0

@Nkosi Tôi rất có kinh nghiệm trong WCF và cũng muốn sử dụng EntityFramework phía sau nó. Bạn có biết bất kỳ giải pháp thay thế tốt nào có thể dễ dàng điều chỉnh theo sở thích của tôi không? – modiX

+0

Hãy xem qua hướng dẫn này và xem liệu nó có phù hợp với nhu cầu của bạn không https://developer.xamarin.com/guides/cross-platform/application_fundamentals/web_services/walkthrough_working_with_WCF/ dường như theo cùng một lộ trình tương tự với những gì bạn đang làm . – Nkosi

Trả lời

4

Hãy xem ứng dụng khách WCF chính thức của Microsoft cho .NET Core. Tôi nghĩ rằng điều này cũng nên làm việc với Xamarin vì nó được thiết kế cho .NET Core.

GitHub .NET Core WCF Client Libraries

Web Service Reference guide

Microsoft WCF Web Service Reference Provider

+0

Thú vị. Vì vậy, nếu tôi tham khảo các NET Core WCF khách hàng Thư viện Tôi có thể sử dụng svcutil bình thường để tạo proxy của tôi? Theo tôi biết .NET Core được tăng cường so với .NET Standard. Tôi không chắc tôi có thể tham khảo một thư viện .NET Core trong .NET Standard. Tôi sẽ thử nó sớm. – modiX

+0

Sử dụng tiện ích mở rộng từ liên kết cuối cùng mà tôi đã đăng để tạo proxy. Nó cũng hoạt động với .NET Standard. Đây cũng là cách chính thức để tạo khách hàng.Tôi cũng đã thử với một khách hàng svcutil và nó hoạt động nếu bạn tự cung cấp cấu hình (ràng buộc và địa chỉ điểm cuối) trong hàm tạo của trình khách dịch vụ khi bạn sử dụng nó. Khác bạn nhận được một tập tin cấu hình không được hỗ trợ lỗi. – AlesD

+0

Phần mở rộng đã thêm một mục mới trong các dịch vụ được kết nối khi nhấn chuột phải vào các phụ thuộc được gọi là Tham khảo Dịch vụ Web WCF, tôi có thể khám phá địa chỉ mex của dịch vụ đang chạy của tôi. Khi tôi nhấp vào Hoàn thành nó không thành công với lỗi: "Giải pháp không thể được xây dựng, hãy cố gắng xây dựng lại giải pháp và khắc phục mọi sự cố xây dựng.", Mặc dù, toàn bộ giải pháp của tôi có thể được xây dựng. Làm thế nào điều này có thể được giải quyết? Ngoài ra: Tôi đã xây dựng các thư viện WCF. Tôi có phải tham khảo tất cả các tệp DLL trong bin \ ref \ ngay bây giờ không? Hoặc từ nơi tôi cần phải ref những gì libs? Tôi chỉ cần giao tiếp tcp trên mạng. Cảm ơn! – modiX

Các vấn đề liên quan