Điều này có thể là do ràng buộc điểm cuối dịch vụ không sử dụng giao thức HTTP


87

Tôi có một Dịch vụ WCF đang chạy tốt trên máy cục bộ của mình. Tôi đã đặt nó trên máy chủ và gặp lỗi sau:

Đã xảy ra lỗi khi nhận phản hồi HTTP tới http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc . Điều này có thể là do ràng buộc điểm cuối dịch vụ không sử dụng giao thức HTTP. Điều này cũng có thể là do ngữ cảnh yêu cầu HTTP bị máy chủ hủy bỏ (có thể do dịch vụ ngừng hoạt động). Xem nhật ký máy chủ để biết thêm chi tiết.]

Tôi đã truy cập dịch vụ trong url và nó đang hoạt động bình thường. Tất cả những gì tôi đang làm cho hàm là trả về một chuỗi thành tên hình ảnh, vì vậy dữ liệu được truyền không nhiều. Tôi đã theo dõi nhật ký và nó cung cấp cho tôi thông tin tương tự. Đây là cấu hình máy khách của tôi:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Đây là cấu hình máy chủ của tôi:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Nó có phải là một cài đặt trên máy chủ vì nó hoạt động trên máy cục bộ của tôi không?


Tôi đã giải quyết sự cố của mình như đã giải thích ở đây: stackoverflow.com/questions/5537794/…
Adi

Có vẻ như bạn đã tiến xa hơn tôi. Có lẽ bạn có thể cho tôi một gợi ý về những gì cần làm tiếp theo. stackoverflow.com/questions/16628382/…
Niels Brinch

Bất kỳ cơ hội nào bạn sẽ chấp nhận bất kỳ câu trả lời nào, vì tôi nghi ngờ rằng bạn vẫn đang chờ đợi để có được một câu trả lời? :)
Noctis

Câu trả lời:


100

Tôi nghĩ rằng có vấn đề tuần tự hóa, bạn có thể tìm thấy lỗi chính xác chỉ cần thêm mã bên dưới vào cấu hình dịch vụ trong <configuration>phần.

Sau khi cấu hình cập nhật "App_tracelog.svclog"tập tin sẽ được tạo, nơi dịch vụ của bạn tồn tại chỉ cần mở .svclogtập tin và tìm dòng màu đỏ trên bảng điều khiển bên trái là lỗi và xem mô tả của nó để biết thêm thông tin.

tôi hy vọng điều này sẽ giúp tìm ra lỗi của bạn.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

4
Điều này đã thực sự cứu được ngày của tôi. Đó thực sự là một vấn đề tuần tự hóa, và tôi đã thiếu System.Runtime.Serializationnguồn trong dấu vết của mình.
julealgon

Đẹp ... đã không nhận thức được :) này
Noctis

sử thi! mà viết sai, mà đã không có trong bất kỳ ngoại lệ, vào file App_tracelog.svclog
Fubo

Xuất sắc! Cảm ơn
SyntaxError

1
Đảm bảo dán <system.diagnostics>phần vào cuối tệp, ngay phía trên </configuration>. Nếu bạn dán nó ở trên cùng, bạn có thể gặp lỗi loại nội dung khi chạy ứng dụng của mình.
Tawab Wakil

75

Tôi gặp sự cố này "Điều này có thể do ràng buộc điểm cuối dịch vụ không sử dụng giao thức HTTP" và dịch vụ WCF sẽ tắt (trong máy phát triển)

Tôi đã tìm ra: trong trường hợp của tôi, vấn đề là do Enums,

Tôi đã giải quyết bằng cách sử dụng cái này

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Tôi phải trang trí Enum của mình bằng DataContract, Flags và tất cả từng thành viên enum có thuộc tính EnumMember.

Tôi đã giải quyết vấn đề này sau khi xem Tài liệu tham khảo msdn này :


1
Cảm ơn bạn. Đây chính xác là những gì tôi phải làm.
Matthew Cole

1
Cảm ơn, bạn vừa cứu tôi rất nhiều thời gian
nixon 11/12/12

4
Cảm ơn rất nhiều .. đã tiết kiệm thời gian của tôi rất nhiều
amesh

Liên quan đến điều này - nếu bạn có loại enum trên hợp đồng không phải là loại của DataMember thì bạn sẽ gặp lỗi này. Tôi chỉ cần thêm một thuộc tính là DataMember và đặt cho nó kiểu enum không phải DataContract.
paz

Không phải nó cũng là trường hợp mà các bảng liệt kê cần phải bắt đầu với chỉ mục 0? Đây chắc chắn là một vấn đề trong quá khứ đối với tôi. Vì vậy, trong ví dụ trên, APPLE = 0 chứ không phải 1.
The Senator

17

Tôi đã gặp lỗi tương tự và vấn đề là tuần tự hóa. Tôi đã quản lý để tìm ra vấn đề thực sự bằng cách sử dụng Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx và giải quyết nó dễ dàng. Có thể điều này sẽ giúp một ai đó.


14

Trong trường hợp của tôi, lỗi được tạo ra do một trong các kiểu phức tạp của tôi có thuộc tính không có phương thức đặt.

Bộ nối tiếp đã ném ra một ngoại lệ vì thực tế đó. Đã thêm các phương pháp thiết lập nội bộ và tất cả đều hoạt động tốt.

Cách tốt nhất để tìm hiểu lý do tại sao điều này đang xảy ra (theo ý kiến ​​của tôi) là bật ghi nhật ký theo dõi.

Tôi đã đạt được điều này bằng cách thêm phần sau vào web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Sau khi thiết lập, tôi chạy ứng dụng khách của mình, có ngoại lệ và kiểm tra tệp 'Traces.svclog'. Từ đó, tôi chỉ cần tìm ngoại lệ.


autoflush = true là chìa khóa
Jeremy Smith

9

Giải pháp với DataContract, Flags for Enums trông hơi xấu xí. Trong trường hợp của tôi, vấn đề đã được giải quyết bằng cách thêm một cái gì đó như "NotSet = 0" vào enum:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

À vâng, xin lỗi, chỉ cần nhận xét về một câu trả lời cao hơn. Tôi cũng đã thấy hành vi này.
The Senator

giải thích: Tôi đã có cùng một vấn đề. Câu trả lời của @ Rikin đã dẫn tôi đến: "Thông báo InnerException là 'Giá trị Enum' 0 'không hợp lệ cho loại ..." từ [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Tôi nhận được jem : "Vấn đề ở đây là bạn không khởi tạo ..Response và nó đang lấy giá trị mặc định (và không hợp lệ) là '0' ... vì vậy nó không thể được tuần tự hóa".
AJ AJ

3

Tôi đã gặp phải vấn đề tương tự và đã giải quyết bằng mã dưới đây. (nếu có bất kỳ vấn đề kết nối TLS nào)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Vui lòng dán dòng này trước khi mở kênh khách hàng.


1

Tôi đã tìm ra vấn đề. Cuối cùng, đường dẫn đến tệp cấu hình của tôi bị sai. Các lỗi cho WCF đôi khi rất hữu ích.



1

Tôi đã thấy lỗi này do tham chiếu hình tròn trong biểu đồ đối tượng gây ra. Việc bao gồm một con trỏ đến đối tượng mẹ từ một phần tử con sẽ khiến bộ tuần tự lặp lại và cuối cùng vượt quá kích thước thông báo tối đa.


1

Lỗi này có thể là do hợp đồng không khớp. Hãy xem xét ứng dụng ba lớp dưới đây ...

Lớp giao diện người dùng
|
Lớp xử lý
|
Lớp truy cập dữ liệu
-> Hợp đồng giữa quy trình và lớp giao diện người dùng có cùng một enum bị thiếu (Onhold = 3). Enum: Start = 1, Stop = 2. -> Contract between Data Access And Process layer có enum Enum: Start = 1, Stop = 2, Onhold = 3.

Trong trường hợp này, chúng tôi sẽ gặp lỗi tương tự trong phản hồi của lớp quy trình.

Lỗi tương tự xảy ra trong hợp đồng không khớp khác trong ứng dụng nhiều lớp.


Câu trả lời của bạn dường như không liên quan gì đến câu hỏi. Cũng lưu ý rằng OP đã giải quyết vấn đề của mình - đường dẫn đến tệp cấu hình bị sai .
Simon MᶜKenzie

1

Tôi gặp sự cố này vì tôi đã định cấu hình Dịch vụ WCF của mình để trả về System.Data.DataTable.

Nó hoạt động tốt trong trang HTML thử nghiệm của tôi, nhưng bị nổ khi tôi đặt nó vào ứng dụng Windows Form của mình.

Tôi phải truy cập và thay đổi chữ ký Hợp đồng hoạt động của Dịch vụ từ DataTable sang DataSet và trả lại dữ liệu tương ứng.

Nếu bạn gặp sự cố này, bạn có thể muốn thêm một Hợp đồng hoạt động bổ sung vào Dịch vụ của mình để không phải lo lắng về việc vi phạm mã dựa trên Dịch vụ hiện có.


1

Điều này có thể do nhiều lý do; dưới đây là một vài trong số đó:

  1. Nếu bạn đang sử dụng các đối tượng hợp đồng dữ liệu phức tạp (có nghĩa là đối tượng tùy chỉnh có nhiều đối tượng tùy chỉnh con hơn), hãy đảm bảo bạn có tất cả các đối tượng tùy chỉnh được trang trí bằng các thuộc tính DataContract và DataMember
  2. Nếu các đối tượng hợp đồng dữ liệu của bạn sử dụng kế thừa, hãy đảm bảo rằng tất cả các lớp cơ sở đều có thuộc tính DataContract và DataMember. Ngoài ra, bạn cần phải có các lớp cơ sở chỉ định các lớp dẫn xuất với thuộc tính [Đã biết (typeof (BaseClassType))]] ( xem thêm thông tin ở đây ).

  3. Đảm bảo tất cả các thuộc tính đối tượng hợp đồng dữ liệu của bạn có cả thuộc tính get và set.


1

Vấn đề của tôi là có quá nhiều mục được chuyển giữa máy khách và máy chủ. Tôi đã phải thay đổi cài đặt này trong hành vi của cả hai bên.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Tôi đã sử dụng cùng một giải pháp. Nhưng tôi đã phải sử dụng Service Trace Viewer theo đề xuất của @ 100r để xem đó là lỗi.
Björn

1

Điều này có thể không liên quan đến vấn đề cụ thể của bạn, nhưng thông báo lỗi bạn đã đề cập có nhiều nguyên nhân, một trong số đó là do sử dụng kiểu trả về cho [OperationContract] trừu tượng, có giao diện hoặc không được biết đến với mã máy khách WCF.

Kiểm tra bài đăng (và giải pháp) bên dưới

https://stackoverflow.com/a/5310951/74138


1

Tôi nghĩ cách tốt nhất để giải quyết vấn đề này là làm theo lời khuyên về lỗi, do đó tìm kiếm nhật ký máy chủ. Để bật nhật ký tôi đã thêm

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Sau đó, bạn truy cập c: \ logs \ TracesServ_ce.svclog, mở nó bằng trình xem theo dõi dịch vụ của microsoft. Và xem vấn đề thực sự là gì.



1

Tôi đã vật lộn với điều này trong vài ngày và thử mọi câu trả lời từ bài đăng này và nhiều bài khác và chia sẻ giải pháp của tôi vì các triệu chứng giống nhau nhưng vấn đề thì khác.

Vấn đề là nhóm ứng dụng đã được định cấu hình với giới hạn bộ nhớ và nó chỉ được tái chế sau một khoảng thời gian thay đổi.

Hy vọng điều này sẽ giúp ai đó khác!
Lời chào hỏi,


1

Vấn đề của tôi là, loại trả lại của dịch vụ của tôi là chuỗi. Nhưng tôi đã trả về chuỗi kiểu xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

vì vậy lỗi đã được ném ra.


1

trong trường hợp của tôi

dịch vụ của tôi có chức năng download Files

và lỗi này chỉ hiển thị khi cố gắng tải xuống Big Files

vì vậy tôi tìm thấy câu trả lời này cho Tăng maxRequestLengthlên giá trị cần thiết trongweb.config

Tôi biết điều đó thật kỳ lạ, nhưng vấn đề đã được giải quyết

Nếu bạn không thực hiện bất kỳ thao tác tải lên hoặc tải xuống nào, có thể câu trả lời này sẽ không giúp được bạn


1

Đối với tôi, các giải pháp của Lỗi này rất lạ. Đó là vấn đề về địa chỉ cổng của EndpointAddress . Trong Visual studio, địa chỉ cổng của tệp của bạn (ví dụ: Service1.svc) và địa chỉ cổng của dự án wcf của bạn phải giống với địa chỉ mà bạn cung cấp cho EndpointAddress . Hãy để tôi mô tả cho bạn giải pháp này chi tiết.

Có hai bước để kiểm tra địa chỉ cổng.

  1. Trong Dự án WCF của bạn, nhấp chuột phải vào tệp Dịch vụ của bạn (ví dụ: Service1.svc) -> chọn Xem trong trình duyệt bây giờ trong trình duyệt của bạn, bạn có url như http: // localhost: 61122 / Service1.svc vì vậy bây giờ hãy ghi lại địa chỉ cổng của bạn như một 61122

  2. Nhấp chuột nhanh vào dự án wcf của bạn -> chọn Thuộc tính -> chuyển đến Tab Web -> Bây giờ trong phần Máy chủ -> chọn Sử dụng Máy chủ phát triển Visual Studio -> chọn Cổng cụ thể và cung cấp địa chỉ cổng mà chúng tôi đã tìm thấy trước đó từ Dịch vụ1 của chúng tôi. dịch vụ svc. Đó là (61122) .

Trước đó tôi có địa chỉ cổng khác. Sau khi chỉ định đúng địa chỉ cổng mà tôi đã đưa vào EndpointAddress , vấn đề của tôi đã được giải quyết.

Tôi hy vọng điều này có thể được giải quyết vấn đề của bạn.


0

Cũng có vấn đề này và đó là do quên trang trí mô hình của tôi với các thuộc tính DataContract và DataMember


0

Nếu bạn có cơ sở dữ liệu (làm việc trong studio trực quan), hãy đảm bảo rằng không có khóa ngoại nào trong các bảng, tôi đã có khóa ngoại và nó đã cho tôi lỗi này và khi tôi gỡ bỏ chúng, nó chạy trơn tru

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.