อาจเป็นเพราะการเชื่อมจุดสิ้นสุดของบริการไม่ได้ใช้โปรโตคอล HTTP


88

ฉันมีบริการ WCF ที่ทำงานได้ดีบนเครื่องในพื้นที่ของฉัน ฉันวางไว้บนเซิร์ฟเวอร์และฉันได้รับข้อผิดพลาดต่อไปนี้:

เกิดข้อผิดพลาดขณะที่ได้รับการตอบสนอง HTTP เพื่อ http: //xx.xx.x.xx: 8200 / บริการ / WCFClient.svc อาจเป็นเพราะการเชื่อมจุดสิ้นสุดของบริการไม่ได้ใช้โปรโตคอล HTTP นอกจากนี้ยังอาจเนื่องมาจากบริบทคำขอ HTTP ถูกเซิร์ฟเวอร์ยกเลิก (อาจเนื่องมาจากการปิดบริการ) ดูบันทึกเซิร์ฟเวอร์สำหรับรายละเอียดเพิ่มเติม]

ฉันไปที่บริการใน url แล้วและมันทำงานได้อย่างถูกต้อง สิ่งที่ฉันทำเพื่อฟังก์ชั่นนี้คือการส่งคืนสตริงไปยังชื่อรูปภาพดังนั้นข้อมูลที่ส่งผ่านจึงไม่มาก ฉันได้ติดตามบันทึกและให้ข้อมูลเดียวกันกับฉัน นี่คือการกำหนดค่าไคลเอ็นต์ของฉัน:

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

นี่คือการกำหนดค่าเซิร์ฟเวอร์ของฉัน:

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

จะเป็นการตั้งค่าบนเซิร์ฟเวอร์หรือไม่เนื่องจากทำงานบนเครื่องภายในของฉัน


ฉันแก้ไขปัญหาของฉันตามที่อธิบายไว้ที่นี่: stackoverflow.com/questions/5537794/…
Adi

ดูเหมือนว่าคุณมาไกลกว่าฉัน บางทีคุณอาจบอกฉันได้ว่าต้องทำอะไรต่อไป stackoverflow.com/questions/16628382/…
Niels Brinch

มีโอกาสที่คุณจะยอมรับคำตอบใด ๆ เนื่องจากฉันสงสัยว่าคุณยังคงรอคำตอบอยู่ใช่ไหม :)
Noctis

คำตอบ:


102

ฉันคิดว่ามีปัญหาการทำให้เป็นอนุกรมคุณสามารถค้นหาข้อผิดพลาดที่แน่นอนเพียงแค่เพิ่มโค้ดด้านล่างในการกำหนดค่าบริการใน<configuration>ส่วน

หลังจาก"App_tracelog.svclog"ไฟล์อัปเดต config จะสร้างขึ้นโดยที่บริการของคุณมีอยู่เพียงแค่ต้องเปิด.svclogไฟล์และค้นหาเส้นสีแดงที่แผงด้านซ้ายซึ่งเป็นข้อผิดพลาดและดูคำอธิบายสำหรับข้อมูลเพิ่มเติม

ฉันหวังว่านี่จะช่วยค้นหาข้อผิดพลาดของคุณ

<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
นี่ช่วยวันของฉันได้จริง มันเป็นปัญหาการทำให้เป็นอนุกรมจริง ๆ และฉันไม่มีSystem.Runtime.Serializationแหล่งที่มาในการติดตาม
julealgon

Nice ... ไม่ทราบเรื่องนี้ :)
Noctis

มหากาพย์! ที่เขียนข้อผิดพลาดซึ่งไม่มีข้อยกเว้นใด ๆ ลงในไฟล์ App_tracelog.svclog
fubo

ยอดเยี่ยม! ขอบคุณ
SyntaxError

1
ให้แน่ใจว่าได้วาง<system.diagnostics>ส่วนที่อยู่ตอนท้าย</configuration>ของไฟล์เหนือ หากคุณวางไว้ที่ด้านบนคุณอาจได้รับข้อผิดพลาดประเภทเนื้อหาเมื่อเรียกใช้แอปของคุณ
Tawab Wakil

76

ฉันประสบปัญหานี้ "อาจเกิดจากการเชื่อมจุดสิ้นสุดของบริการไม่ได้ใช้โปรโตคอล HTTP" และบริการ WCF จะปิดตัวลง (ในเครื่องพัฒนา)

ฉันคิดออก: ในกรณีของฉันปัญหาเกิดจาก Enums

ฉันแก้ไขโดยใช้สิ่งนี้

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

    }

ฉันต้องตกแต่ง Enums ของฉันด้วย DataContract, Flags และสมาชิก enum ทั้งหมดด้วยแอตทริบิวต์ EnumMember

ฉันแก้ไขสิ่งนี้หลังจากดูการอ้างอิง msdnนี้:


1
ขอขอบคุณ. นี่คือสิ่งที่ฉันต้องทำด้วย
Matthew Cole

1
ขอบคุณคุณช่วยฉันได้หลายเวลา
nixon

4
ขอบคุณมาก .. ประหยัดเวลาของฉันได้มาก
amesh

ที่เกี่ยวข้องกับสิ่งนี้ - หากคุณมีประเภท enum ในสัญญาที่ไม่ใช่ประเภทของ DataMember คุณจะได้รับข้อผิดพลาดนี้ ฉันเพิ่งเพิ่มคุณสมบัติที่เป็น DataMember และให้ประเภท enum ที่ไม่ใช่ DataContract
paz

ไม่ใช่กรณีที่การแจงนับต้องเริ่มต้นด้วยดัชนี 0? นี่เป็นปัญหาในอดีตสำหรับฉันอย่างแน่นอน ดังนั้นในตัวอย่างข้างต้น APPLE = 0 แทนที่จะเป็น 1
วุฒิสมาชิก

17

ฉันมีข้อผิดพลาดเดียวกันนี้และปัญหาคือการทำให้เป็นอนุกรม ฉันจัดการเพื่อค้นหาปัญหาที่แท้จริงโดยใช้ Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspxและแก้ไขได้ง่าย บางทีนี่อาจจะช่วยใครบางคนได้


14

ในอินสแตนซ์ของฉันข้อผิดพลาดถูกสร้างขึ้นเนื่องจากประเภทที่ซับซ้อนของฉันมีคุณสมบัติที่ไม่มีวิธีการตั้งค่า

Serializer โยนข้อยกเว้นเนื่องจากข้อเท็จจริงนั้น เพิ่มวิธีการตั้งค่าภายในและทุกอย่างทำงานได้ดี

วิธีที่ดีที่สุดในการค้นหาสาเหตุที่เกิดขึ้น (ในความคิดของฉัน) คือการเปิดใช้งานการบันทึกการติดตาม

ฉันทำได้โดยการเพิ่มส่วนต่อไปนี้ใน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>

เมื่อตั้งค่าแล้วฉันรันไคลเอนต์ของฉันได้รับข้อยกเว้นและตรวจสอบไฟล์ 'Traces.svclog' จากตรงนั้นฉันต้องหาข้อยกเว้นเท่านั้น


autoflush = true is key
Jeremy Smith

9

การแก้ปัญหาด้วย DataContract การตั้งค่าสถานะสำหรับ Enums ดูน่าเกลียดเล็กน้อย ในกรณีของฉันปัญหาได้รับการแก้ไขโดยการเพิ่มบางสิ่งเช่น "NotSet = 0" ลงใน enum:

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

อ๊ะใช่ขอโทษเพียงแสดงความคิดเห็นในคำตอบเพิ่มเติม เคยเจอพฤติกรรมแบบนี้เหมือนกัน
วุฒิสมาชิก

คำอธิบาย: ฉันมีปัญหาเดียวกัน คำตอบของ @ Rikin ทำให้ฉันไปที่: "ข้อความ InnerException คือ 'ค่า Enum' 0 'ไม่ถูกต้องสำหรับประเภท ... " จาก [ social.msdn.microsoft.com/Forums/vstudio/en-US/…ฉันได้รับ jem: "ปัญหานี้คือคุณไม่ได้เริ่มต้น .. การตอบสนองและใช้ค่าเริ่มต้น (และไม่ถูกต้อง) เป็น '0' ... จึงไม่สามารถต่ออนุกรมได้"
AJ AJ

3

ฉันประสบปัญหาเดียวกันและแก้ไขด้วยรหัสด้านล่าง (หากมีปัญหาการเชื่อมต่อ TLS)

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

กรุณาวางบรรทัดนี้ก่อนเปิดช่องลูกค้า


2

ฉันเห็นข้อผิดพลาดนี้เกิดจากการอ้างอิงแบบวงกลมในกราฟวัตถุ การรวมตัวชี้ไปยังออบเจ็กต์หลักจากลูกจะทำให้ serializer วนซ้ำและท้ายที่สุดจะเกินขนาดข้อความสูงสุด


1

ฉันพบปัญหาแล้ว ดูเหมือนว่าเส้นทางไปยังไฟล์กำหนดค่าของฉันผิด ข้อผิดพลาดสำหรับ WCF มีประโยชน์มากในบางครั้ง


1

เพื่อแก้ไขปัญหานี้เรามีการเปลี่ยนแปลง AppPool เอกลักษณ์ไปยังบัญชีของผู้ดูแลระบบ


สิ่งนี้มีประโยชน์กับฉัน ฉันไม่ได้ทำตามที่ Sarjan แนะนำอย่างแน่นอน แต่ให้สิทธิ์ในการอ่าน / เขียนในโฟลเดอร์แอปพลิเคชัน (ภายใต้ wwwroot ... ) ไปยังข้อมูลประจำตัวพูลแอปพลิเคชันที่ฉันใช้อยู่
Francesco B.

1

ข้อผิดพลาดนี้อาจเป็นเพราะสัญญาไม่ตรงกัน พิจารณาแอปพลิเคชันสามชั้นด้านล่าง ...

เลเยอร์ UI
|
เลเยอร์กระบวนการ
|
ชั้นการเข้าถึงข้อมูล
-> Contract between Process และ UI layer มี enum เดียวกันกับที่หายไป (Onhold = 3) Enum: Start = 1, Stop = 2 -> สัญญาระหว่างการเข้าถึงข้อมูลและเลเยอร์กระบวนการมี enum Enum: Start = 1, Stop = 2, Onhold = 3

ในกรณีนี้เราจะได้รับข้อผิดพลาดเดียวกันในการตอบสนองของเลเยอร์กระบวนการ

ข้อผิดพลาดเดียวกันนี้เกิดขึ้นในสัญญาอื่น ๆ ที่ไม่ตรงกันในแอปพลิเคชันหลายชั้น


คำตอบของคุณดูเหมือนจะไม่เกี่ยวข้องกับคำถาม ยังทราบว่า OP มีการแก้ไขปัญหาของเขาอยู่แล้ว - เส้นทางไปยังไฟล์ config เป็นที่ไม่ถูกต้อง
Simon MᶜKenzie

1

ฉันมีปัญหานี้เนื่องจากฉันกำหนดค่าบริการ WCF ของฉันให้ส่งคืน System.Data.DataTable

มันทำงานได้ดีในหน้า HTML ทดสอบของฉัน แต่ก็ระเบิดขึ้นเมื่อฉันใส่สิ่งนี้ในแอปพลิเคชัน Windows Form

ฉันต้องเข้าไปและเปลี่ยนลายเซ็นสัญญาการดำเนินงานของบริการจาก DataTable เป็น DataSet และส่งคืนข้อมูลตามนั้น

หากคุณมีปัญหานี้คุณอาจต้องการเพิ่มสัญญาการดำเนินงานเพิ่มเติมในบริการของคุณดังนั้นคุณจึงไม่ต้องกังวลเกี่ยวกับการทำลายรหัสที่ต้องอาศัยบริการที่มีอยู่


1

อาจเกิดจากหลายสาเหตุ ด้านล่างนี้เป็นเพียงไม่กี่รายการ:

  1. หากคุณกำลังใช้ออบเจ็กต์สัญญาข้อมูลที่ซับซ้อน (นั่นหมายถึงออบเจ็กต์แบบกำหนดเองที่มีอ็อบเจ็กต์แบบกำหนดเองลูกมากกว่า) ตรวจสอบให้แน่ใจว่าคุณมีอ็อบเจ็กต์แบบกำหนดเองทั้งหมดที่ตกแต่งด้วยแอ็ตทริบิวต์ DataContract และ DataMember
  2. ถ้าออบเจ็กต์สัญญาข้อมูลของคุณใช้การสืบทอดตรวจสอบให้แน่ใจว่าคลาสพื้นฐานทั้งหมดมีแอตทริบิวต์ DataContract และ DataMember นอกจากนี้คุณต้องให้คลาสพื้นฐานระบุคลาสที่ได้รับด้วยแอตทริบิวต์ [KnownType (typeof (BaseClassType))] ( ดูข้อมูลเพิ่มเติมที่นี่ )

  3. ตรวจสอบให้แน่ใจว่าคุณสมบัติออบเจ็กต์สัญญาข้อมูลของคุณทั้งหมดมีคุณสมบัติทั้ง get และ set


1

ปัญหาของฉันคือมีการส่งผ่านรายการระหว่างไคลเอนต์และเซิร์ฟเวอร์มากเกินไป ฉันต้องเปลี่ยนการตั้งค่านี้ในพฤติกรรมทั้งสองด้าน

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

ฉันใช้วิธีแก้ปัญหาเดียวกัน แต่ฉันต้องใช้ Service Trace Viewer ตามที่แนะนำโดย @ 100r เพื่อดูว่าเป็นข้อผิดพลาด
Björn

1

สิ่งนี้อาจไม่เกี่ยวข้องกับปัญหาเฉพาะของคุณ แต่ข้อความแสดงข้อผิดพลาดที่คุณกล่าวถึงมีสาเหตุหลายประการหนึ่งในนั้นใช้ประเภทการส่งคืนสำหรับ [OperationContract] ที่เป็นนามธรรมอินเทอร์เฟซหรือรหัสไคลเอ็นต์ WCF ที่ไม่รู้จัก

ตรวจสอบโพสต์ (และวิธีแก้ปัญหา) ด้านล่าง

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


1

ฉันคิดว่าวิธีที่ดีที่สุดในการแก้ปัญหานี้คือทำตามคำแนะนำข้อผิดพลาดจึงมองหาบันทึกเซิร์ฟเวอร์ ในการเปิดใช้งานบันทึกฉันเพิ่ม

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

จากนั้นคุณไปที่ c: \ logs \ TracesServ_ce.svclog เปิดด้วยโปรแกรมดูการติดตามบริการของ Microsoft และดูว่าปัญหาจริงๆคืออะไร


1

สำหรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับปัญหานี้โปรดดู: การเชื่อมต่อที่มีอยู่ถูกบังคับปิดโดยโฮสต์ระยะไกล - WCF

ปัญหาของฉันคือการที่วัตถุการถ่ายโอนข้อมูลของฉันซับซ้อนเกินไป เริ่มต้นด้วยคุณสมบัติง่ายๆเช่นpublic long Id { get; set; }และเมื่อคุณได้ผลแล้วให้เริ่มเพิ่มสิ่งอื่น ๆ ตามต้องการ


1

ฉันต่อสู้กับสิ่งนี้มาสองสามวันแล้วและลองทุกคำตอบจากโพสต์นี้และอื่น ๆ อีกมากมายและแบ่งปันวิธีแก้ปัญหาของฉันเพราะอาการเหมือนกัน แต่ปัญหาแตกต่างกัน

ปัญหาคือพูลแอปถูกกำหนดค่าด้วยขีด จำกัด หน่วยความจำและเพิ่งถูกรีไซเคิลหลังจากช่วงเวลาที่ผันแปร

หวังว่านี่จะช่วยคนอื่นได้!
ทักทาย,


1

ปัญหาของฉันคือประเภทการส่งคืนบริการของฉันคือสตริง แต่ฉันส่งคืนสตริงประเภท xml:

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

ข้อผิดพลาดจึงเกิดขึ้น


1

ในกรณีของฉัน

บริการของฉันมีหน้าที่ในการ download Files

และข้อผิดพลาดนี้ปรากฏขึ้นเมื่อพยายามดาวน์โหลดเท่านั้น Big Files

ฉันจึงพบคำตอบนี้เพื่อเพิ่มmaxRequestLengthเป็นค่าที่ต้องการในweb.config

ฉันรู้ว่ามันแปลก แต่แก้ปัญหาได้

หากคุณไม่ทำการอัปโหลดหรือดาวน์โหลดคำตอบนี้อาจไม่ช่วยคุณ


1

สำหรับฉันการแก้ไขข้อผิดพลาดนี้แปลกมาก มันเป็นปัญหาของการอยู่พอร์ตของEndpointAddress ที่อยู่ในพอร์ตสตูดิโอภาพและไฟล์ของคุณ (เช่น Service1.svc) และที่อยู่ของพอร์ตของโครงการ WCF ของคุณจะต้องเหมือนกันที่คุณให้เข้าEndpointAddress ให้ฉันอธิบายวิธีแก้ปัญหานี้โดยละเอียด

มีสองขั้นตอนในการตรวจสอบที่อยู่พอร์ต

  1. ในโครงการ WCF ของคุณให้คลิกขวาที่ไฟล์บริการของคุณ (เช่น Service1.svc) -> กว่าเลือกดูในเบราว์เซอร์ตอนนี้ในเบราว์เซอร์ของคุณคุณมี url เช่นhttp: // localhost: 61122 / Service1.svc ดังนั้นตอนนี้จดที่อยู่พอร์ตของคุณเป็น ก 61122

  2. คลิกขวาที่โปรเจ็กต์ wcf ของคุณ -> กว่าเลือกคุณสมบัติ -> ไปที่แท็บเว็บ -> ตอนนี้ในส่วนเซิร์ฟเวอร์ -> เลือกใช้ Visual Studio Development Server -> เลือกพอร์ตเฉพาะและระบุที่อยู่พอร์ตที่เราพบก่อนหน้านี้จาก Service1 ของเรา บริการ svc นั่นคือ(61,122)

ก่อนหน้านี้ฉันมีที่อยู่พอร์ตอื่น หลังจากระบุที่อยู่พอร์ตอย่างถูกต้องซึ่งฉันได้ให้ไว้ในEndpointAddressปัญหาของฉันได้รับการแก้ไขแล้ว

ฉันหวังว่านี่อาจช่วยแก้ปัญหาของคุณได้



0

หากคุณมีฐานข้อมูล (ทำงานในวิชวลสตูดิโอ) ตรวจสอบให้แน่ใจว่าไม่มีคีย์แปลกปลอมในตารางฉันมีคีย์แปลกปลอมและทำให้เกิดข้อผิดพลาดนี้และเมื่อฉันลบออกมันก็ทำงานได้อย่างราบรื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.