Dịch vụ không có điểm cuối ứng dụng (không phải cơ sở hạ tầng)


91

Gần đây tôi đã tạo một dịch vụ WCF (dll) và một máy chủ dịch vụ (exe). Tôi biết dịch vụ WCF của mình đang hoạt động bình thường vì tôi có thể thêm thành công dịch vụ vào WcfTestClient.

Tuy nhiên, dường như tôi đang gặp phải vấn đề khi tôi sử dụng WCF từ một máy chủ dịch vụ (exe). Tôi có thể thêm tham chiếu đến WCF (dll) vào máy chủ dịch vụ của mình (exe) và tạo các thành phần cần thiết cho exe; chẳng hạn như trình cài đặt dịch vụ, máy chủ dịch vụ và app.config, biên dịch và cuối cùng cài đặt exe bằng InstallUtil. Tuy nhiên, khi tôi cố gắng khởi động dịch vụ trong Microsoft Management Console, dịch vụ ngay lập tức dừng sau khi được khởi động.

Vì vậy, tôi đã bắt đầu điều tra chính xác điều gì có thể gây ra sự cố này, do lỗi này từ Nhật ký ứng dụng trong Trình xem sự kiện.

Sự miêu tả:

Không thể bắt đầu dịch vụ. System.InvalidOperationException: Dịch vụ 'Dịch vụ' không có điểm cuối ứng dụng (không phải cơ sở hạ tầng). Điều này có thể do không tìm thấy tệp cấu hình nào cho ứng dụng của bạn hoặc vì không tìm thấy phần tử dịch vụ nào khớp với tên dịch vụ trong tệp cấu hình hoặc do không có điểm cuối nào được xác định trong phần tử dịch vụ.

Lỗi này thực sự được tạo ra trong OnStart; trong exe của tôi, khi tôi thực hiện cuộc gọi này ServiceHost.Open(). Tôi đã thấy nhiều bài đăng mà các cá nhân khác gặp phải vấn đề này, tuy nhiên hầu hết nếu không phải tất cả, đều cho rằng tên dịch vụ hoặc hợp đồng; không gian tên và tên lớp, không được chỉ định. Tôi đã kiểm tra cả hai mục này trong tệp cấu hình của mình; trong exe cũng như trong dll, và chúng khớp với nhau HOÀN HẢO. Tôi đã nhờ những người khác trong văn phòng kiểm tra kỹ lưỡng sau lưng tôi để đảm bảo rằng tôi không bị mù ở một thời điểm nào đó, nhưng tất nhiên họ cũng đưa ra kết luận giống tôi rằng mọi thứ có vẻ như được chỉ định chính xác. Tôi thực sự không hiểu chuyện gì đang xảy ra vào thời điểm này. Bất cứ ai có thể giúp tôi với vấn đề này?

Một điều khác được đưa ra như một lý do khả dĩ điều này có thể xảy ra là app.config không bao giờ được đọc; ít nhất không phải là cuốn tôi nghĩ nên được đọc. Đây có thể là vấn đề? Nếu vậy, tôi có thể giải quyết vấn đề này bằng cách nào. Một lần nữa, BẤT KỲ sự giúp đỡ nào sẽ được đánh giá cao.


2
Định nghĩa của hợp đồng dịch vụ phải được sao chép từ service.dll.config sang service.exe.config.
John Saunders

1
bạn có thể cho chúng tôi xem app.config của dịch vụ không ?? Bạn có làm điều gì đặc biệt trong dịch vụ NT để khởi tạo / mở ServiceHost không?
marc_s

Câu trả lời:


93

Tôi vừa gặp sự cố này và đã giải quyết nó bằng cách thêm không gian tên vào tên dịch vụ, ví dụ:

 <service name="TechResponse">

đã trở thành

 <service name="SvcClient.TechResponse">

Tôi cũng đã thấy nó được giải quyết bằng Web.config thay vì App.config.


Vâng, chúng tôi đã thay đổi không gian tên nên không thể tìm thấy dịch vụ phù hợp với không gian tên trong tệp .svc (dấu gạch dưới được chuyển thành dấu chấm!) Việc kiểm tra nhanh tên dịch vụ cho thấy những gì đã xảy ra.

1
Tôi cũng đã giải quyết được vấn đề của mình, rất thích các bản sửa lỗi nhanh chóng và dễ dàng này!
vfilby

Thêm một web.config đã giúp giải quyết lỗi này cho tôi.
Ryan Rodemoyer

2
Điều này đã giải quyết vấn đề của tôi !!! Cảm ơn rất nhiều! Đối với tất cả những người mới như tôi: đề xuất hướng dẫn thực sự rõ ràng này: lourenco.co.za/blog/2013/08/…
Homer1982

12

Điểm cuối cũng phải có không gian tên:

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />

Tôi có cái này trong app.config nhưng tôi muốn thay đổi nó trong mã mà không xóa nó khỏi app.config. Sử dụng ServiceHost mới với địa chỉ điểm cuối mới sẽ gây ra lỗi.
Paul McCarthy

9

Một điều cần suy nghĩ là: Bạn có WCF hoàn toàn không bị tách khỏi WindowsService (WS) không? Một WS rất khó vì bạn không có nhiều quyền kiểm soát hoặc khả năng hiển thị đối với chúng. Tôi cố gắng giảm thiểu điều này bằng cách đưa tất cả nội dung không phải WS của tôi vào các lớp riêng của chúng để chúng có thể được kiểm tra độc lập với WS chủ. Sử dụng phương pháp này có thể giúp bạn loại bỏ bất kỳ điều gì đang xảy ra với thời gian chạy WS so với dịch vụ của bạn nói riêng.

John có thể đúng rằng đó là sự cố tệp .config. WCF sẽ luôn tìm kiếm ngữ cảnh thực thi .config . Vì vậy, nếu bạn đang lưu trữ WCF của mình trong các bối cảnh thực thi khác nhau (nghĩa là thử nghiệm với ứng dụng bảng điều khiển và triển khai với WS), bạn cần đảm bảo rằng bạn đã chuyển dữ liệu cấu hình WCF sang tệp .config thích hợp. Nhưng vấn đề cơ bản đối với tôi là bạn không biết vấn đề là gì vì WS goo cản trở. Nếu bạn vẫn chưa cấu trúc lại để có thể chạy dịch vụ của mình trong bất kỳ ngữ cảnh nào (đó là kiểm tra đơn vị hoặc bảng điều khiển), thì tôi sẽ không làm như vậy. Nếu bạn mở rộng dịch vụ của mình trong một thử nghiệm đơn vị, nó có thể sẽ không thành công giống như cách bạn đang thấy với WS, dễ gỡ lỗi hơn nhiều so với cố gắng làm như vậy với hệ thống ống nước yucky WS.


1
Cảm ơn vì đã phản hồi rất nhanh. Tôi đã sao chép qua app.config từ WCF (dll) của mình, vì vậy tôi không nghĩ đó là vấn đề. Nhưng tôi chỉ thấy kỳ lạ là tôi có thể đưa WCF (dll) của mình lên bằng WcfTestclient.exe mà không gặp bất kỳ vấn đề nào. Đối với tôi, có vẻ như nếu bất cứ điều gì là sương mù với tệp cấu hình thì nó cũng sẽ bị lỗi ở đó, không chỉ khi tôi cố gắng chạy nó trong Máy chủ dịch vụ Windows (exe). Tôi xin lỗi nếu tôi nghe có vẻ hơi "lạc lối", thật không may, tôi vẫn là một người mới tại WCF và giai đoạn dịch vụ. Bất cứ một đề nghị nào khác?
user280626

9

Chỉ cần sao chép tệp App.config từ dự án dịch vụ sang ứng dụng máy chủ bảng điều khiển và dán vào đây, sau đó xóa tệp khỏi dự án dịch vụ.


5

Tôi có một ngoại lệ chi tiết hơn khi tôi thêm nó theo chương trình - AddServiceEndpoint:

string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  

host.AddServiceEndpoint(typeof(MyNamespace.IService),
                        new BasicHttpBinding(), baseAddress);
host.Open();

1
Cảm ơn! chuyển địa chỉ theo cách này cho tôi biết thêm chi tiết về ngoại lệ. Trong trường hợp của tôi nó chỉ đơn giản rằng các cổng được sử dụng bởi quá trình khác :)
Hernan Veiras

Tôi gặp vấn đề tương tự là địa chỉ cơ sở có giống với địa chỉ khi bạn nhấp vào khám phá trong phần tham khảo thêm Dịch vụ không?
ZoomVirus

4

Để chuẩn bị cấu hình cho WCF rất khó và đôi khi định nghĩa loại dịch vụ không được chú ý.

Tôi chỉ viết không gian tên trong thẻ dịch vụ, vì vậy tôi gặp lỗi tương tự.

<service name="ServiceNameSpace">

Đừng quên, thẻ dịch vụ cần có tên lớp dịch vụ đủ điều kiện.

<service name="ServiceNameSpace.ServiceClass">

Đối với những người khác giống như tôi.


1
Ý bạn là như tôi đã trả lời ở đây bốn năm trước?
SteveCav

Chúng trông giống nhau nhưng có một điểm khác biệt. Mẫu sai của bạn là chỉ viết tên lớp ( TechResponse) nhưng của tôi chỉ viết không gian tên ( ServiceNameSpace).
Uğur Aldanmaz

4

Hôm nay tôi gặp phải vấn đề tương tự, đăng ở đây lỗi của tôi và sửa chữa nó để nó có thể giúp đỡ ai đó.

Trong khi cấu trúc lại mã, tôi đã thực sự thay đổi tên lớp Dịch vụ và IService và thay đổi ServiceHost để trỏ đến tên lớp Dịch vụ mới này (như được hiển thị trong đoạn mã) nhưng trong tệp App.Config ứng dụng chủ của tôi, tôi vẫn đang sử dụng tên lớp Dịch vụ cũ . (tham khảo trường tên của phần cấu hình trong đoạn mã bên dưới)

Đây là đoạn mã,

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

và trong tệp App.config trong phần dịch vụ, tôi đã đề cập đến tên lớp dịch vụ cũ, thay đổi nó thành Tên dịch vụ mới đã khắc phục sự cố cho tôi.

  <service name="ProjectName.OldServiceClassName"> 
        <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress=""/>
          </baseAddresses>
        </host>
      </service>

Ở đây cũng vậy. Tôi đã thay đổi cách viết hoa của tên lớp và hợp đồng của mình và mọi thứ đều hoạt động. Cảm ơn.
Chazaq

3

Tôi đã từng gặp vấn đề tương tự. Mọi thứ hoạt động trong VS2010 nhưng khi tôi chạy cùng một dự án trong VS2008, tôi nhận được ngoại lệ đã đề cập.

Những gì tôi đã làm trong dự án VS2008 của mình để làm cho nó hoạt động là thêm một cuộc gọi đến AddServiceEndpointthành viên của đối tượng ServiceHost của tôi.

Đây là đoạn mã của tôi:

Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener");

ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress);

host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener),
                        new BasicHttpBinding(),
                        baseAddress);
host.Open();

Tôi đã không sửa đổi tệp app.config. Nhưng tôi đoán điểm cuối dịch vụ cũng có thể đã được thêm vào tệp .config.


Khi tôi sử dụng phương pháp này, tôi nhận được AddressAccessDeniedException mặc dù tôi có thể sử dụng địa chỉ này cho địa chỉ addServiceReferance của bạn.
ZoomVirus

2

Tôi vừa giải quyết vấn đề này trên dịch vụ của mình. Đây là lỗi tôi nhận được:

Dịch vụ 'EmailSender.Wcf.EmailService' không có điểm cuối ứng dụng (không phải cơ sở hạ tầng). Điều này có thể là do không tìm thấy tệp cấu hình nào cho ứng dụng của bạn hoặc vì không tìm thấy phần tử dịch vụ nào khớp với tên dịch vụ trong tệp cấu hình hoặc do không có điểm cuối nào được xác định trong phần tử dịch vụ.

Đây là hai bước tôi đã sử dụng để sửa nó:

  1. Sử dụng đúng tên lớp đủ điều kiện:

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
  2. Kích hoạt điểm cuối với mexHttpBinding và quan trọng nhất là sử dụng hợp đồng IMetadataExchange:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

2

Lỗi này sẽ xảy ra nếu tệp cấu hình của ứng dụng lưu trữ của dịch vụ WCF của bạn không có cấu hình thích hợp.

Hãy nhớ nhận xét này từ cấu hình:

Khi triển khai dự án thư viện dịch vụ, nội dung của tệp cấu hình phải được thêm vào tệp app.config của máy chủ. System.Configuration không hỗ trợ các tệp cấu hình cho thư viện.

Nếu bạn có Dịch vụ WCF được lưu trữ trong IIS, trong thời gian chạy qua VS.NET, nó sẽ đọc app.config của dự án thư viện dịch vụ, nhưng đọc web.config của máy chủ sau khi được triển khai. Nếu web.config không có <system.serviceModel>cấu hình giống hệt nhau, bạn sẽ nhận được lỗi này. Đảm bảo sao chép cấu hình từ app.config khi nó đã được hoàn thiện.


2

Tôi vừa gặp vấn đề này và đã kiểm tra tất cả các câu trả lời ở trên để đảm bảo rằng tôi không bỏ sót bất kỳ điều gì rõ ràng. Vâng, tôi đã có một vấn đề hiển nhiên. Cách viết hoa của tên lớp trong mã và tên lớp mà tôi đã sử dụng trong tệp cấu hình không khớp.

Ví dụ: nếu tên lớp là CalculatorService và tệp cấu hình đề cập đến Calculatorservice ... bạn sẽ gặp lỗi này.


Vừa trải qua những điều tương tự. Có thể khó tìm, đặc biệt là khi cấu trúc lại các cơ sở mã lớn. Hãy nhớ cập nhật không gian tên trong cấu hình WCF khi di chuyển mọi thứ.
Arve Systad

2

Tôi đã chạy Visual Studio ở chế độ Quản trị viên và nó hoạt động với tôi :) Ngoài ra, hãy đảm bảo rằng tệp app.config mà bạn đang sử dụng để viết cấu hình WCF phải nằm trong dự án nơi sử dụng lớp "ServiceHost" và không phải trong dịch vụ WCF thực tế dự án.


Điều này đã giúp tôi tiết kiệm rất nhiều thời gian. :)
Parag

1

Vấn đề của tôi là khi tôi đổi tên lớp Service1 mặc định của mình cho tệp .svc thành một tên có ý nghĩa hơn, điều này khiến cho web.config behaviorConfiguration và điểm cuối tương ứng với quy ước đặt tên cũ. Cố gắng sửa lỗi web.config của bạn.


1

Một điều quan trọng cần nhớ đối với những người làm việc với ứng dụng Console để lưu trữ dịch vụ WCF là tệp Web.config trong dự án WCF hoàn toàn bị bỏ qua. Nếu system.serviceModelcấu hình của bạn ở đó, thì bạn cần phải chuyển phần cấu hình đó sang App.config của dự án Console của bạn.

Điều này bổ sung cho các câu trả lời liên quan đến việc đảm bảo không gian tên được chỉ định ở đúng nơi.


1

Như một manh mối khác, điều đó thực sự đã khắc phục sự cố này trong trường hợp của tôi.

Tôi đang di chuyển một số dịch vụ WCF từ một ứng dụng bảng điều khiển (cấu hình trong một số dịch vụ WCF mã) sang Azure WebRole để xuất bản chúng trong Azure. Mỗi khi tôi thêm một dịch vụ mới VS sẽ chỉnh sửa web.config của tôi và thêm dòng này:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

Vâng, với tất cả các lời khuyên và câu trả lời ở trên, tôi không thể làm cho nó hoạt động cho đến khi tôi loại bỏ tất cả các thuộc tính trong phần tử serviceHostingEnosystem. Như bạn có thể thấy, tôi không phải là ngôi sao WCF nhưng tôi đã làm cho nó hoạt động với Dịch vụ đầu tiên chỉ bằng cách định cấu hình nó như sau:

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

nhưng khi tôi thêm Dịch vụ thứ hai, nó ngừng hoạt động và tôi nhận ra rằng những thuộc tính đó lại ở đó.

Tôi hy vọng nó giúp bạn tiết kiệm thời gian.


0

Tôi đã gặp lỗi này trong Dịch vụ Windows khi Thư viện Dịch vụ WCF mà tôi đã tạo không được kết nối để lưu trữ, nhưng được kết nối để kết nối. Tôi đã thiếu một điểm cuối. (Tôi muốn cả kết nối và lưu trữ trong Dịch vụ Windows của mình để tôi có thể cung cấp Dịch vụ WCF cho các kết nối khác, cũng như để quá trình chính của Dịch vụ Windows của tôi cũng sử dụng nó để thực hiện các tác vụ khác nhau theo lịch / hẹn giờ.)

Cách khắc phục là tôi đã chọn ngay tệp App.config của mình và chọn Chỉnh sửa cấu hình WCF. Sau đó, tôi đã thực hiện các bước Tạo dịch vụ để có thể kết nối với Dịch vụ WCF của mình. Bây giờ tôi đã có hai điểm cuối trong App.config của mình, không chỉ một. Một điểm cuối dành cho kết nối với Thư viện dịch vụ WCF và điểm cuối khác dành cho việc lưu trữ nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.