المشترك WCF الاستثناء: اتصال تم إغلاقه بشكل غير متوقع

StackOverflow https://stackoverflow.com/questions/232078

  •  04-07-2019
  •  | 
  •  

سؤال

ولدي ثلاثة مشاريع. واحد هو مشروع الخدمات WCF، واحد هو مشروع WPF، واحد هو مشروع وحدة اختبار مايكروسوفت. أنا الإعداد للمشروع WCF الخدمات مع كائن البيانات التي تبدو مثل هذا:

[DataContract]
public enum Priority
{
    Low,
    Medium,
    High
}

[DataContract]
public struct TimeInfo
{
    [DataMember]
    public Int16 EstimatedHours { get; set; }

    [DataMember]
    public Int16 ActualHours { get; set; }

    [DataMember]
    public DateTime StartDate { get; set; }

    [DataMember]
    public DateTime EndDate { get; set; }

    [DataMember]
    public DateTime CompletionDate { get; set; }
}

[DataContract]
public class Task
{
    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public Priority Priority { get; set; }

    [DataMember]
    public TimeInfo TimeInformation { get; set; }

    [DataMember]
    public Decimal Cost { get; set; }
}

وعقدي يبدو مثل هذا:

[ServiceContract]
public interface ITaskManagement
{
    [OperationContract]
    List<Task> GetTasks();

    [OperationContract]
    void CreateTask(Task taskToCreate);

    [OperationContract]
    void UpdateTask(Task taskToCreate);

    [OperationContract]
    void DeleteTask(Task taskToDelete);
}

وعندما أحاول استخدام الخدمة في أي تطبيق WPF أو مشروع وحدة اختبار مع هذا الرمز:

var client = new TaskManagementClient();

textBox1.Text = client.GetTasks().ToString();

client.Close();

وأحصل على الخطأ التالي: "تم إغلاق الاتصال الأساسي: تم إغلاق الاتصال بشكل غير متوقع"

ووapp.config للمشاريع اختبار WPF وحدة بهذا الشكل:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_ITaskManagement" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="Message">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        algorithmSuite="Default" establishSecurityContext="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:9999/TaskManagement.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITaskManagement"
            contract="TaskManagement.ITaskManagement" name="WSHttpBinding_ITaskManagement">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

ووWeb.config لخدمة WCF يبدو مثل هذا:

    <system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="InternetBasedWcfServices.TaskManagementBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
            <behavior name="InternetBasedWcfServices.ScheduleManagementBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="InternetBasedWcfServices.TaskManagementBehavior"
            name="InternetBasedWcfServices.TaskManagement">
            <endpoint address="" binding="wsHttpBinding" contract="InternetBasedWcfServices.ITaskManagement">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
        <service behaviorConfiguration="InternetBasedWcfServices.ScheduleManagementBehavior"
            name="InternetBasedWcfServices.ScheduleManagement">
            <endpoint address="" binding="wsHttpBinding" contract="InternetBasedWcfServices.IScheduleManagement">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

وهذه ليست المرة الأولى التي يحدث فيها هذا، وأنا التخمين انها قضية التكوين. لكن في كل مرة كنت عادة مجرد مهب خدمة بلدي ووضعها الظهر أو إنشاء مشروع خدمة جديدة. ثم كل شيء يعمل بشكل رائع. إذا كان أي شخص لديه أي أفكار، التي من شأنها أن تكون رهيبة. تشك.

**

<اقتباس فقرة>   

تحديث: لقد أضاف تعليق ل أكثر   من استكشاف الأخطاء وإصلاحها بلدي على هذه المشكلة.   عندما تكون إجابة المتاحة، وإذا كان   الجواب هو غير منشورة، سأضيف أنها   و"الجواب" الرسمية.

**

هل كانت مفيدة؟

المحلول

وأنا وجدت الجواب

وطيب، ولست متأكدا إذا كان kewl الرد على سؤالي الخاص، ولكن هنا نذهب. لسبب التعداد بحاجة إلى أن تكون علامة مع [EnumMember] سمات على النحو التالي:

[DataContract]
public enum Priority
{
    [EnumMember]
    Low,
    [EnumMember]
    Medium,
    [EnumMember]
    High
}

وعندما فعلت ذلك بلدي التجارب والخدمات يمكن أن يسمى دون حدوث الخطأ. ما زلت غير متأكد من السبب في ظهور هذا الخطأ بعينه. لا يبدو الخطأ إلى محاذاة في أي علاقة مع السبب وظيفي وقوع الخطأ، ولكن هذا إصلاح كل شيء ممهدة بالتأكيد خارج.

نصائح أخرى

وأما أنت نفسك لاحظت، إذا كنت بمناسبة التعداد كما DataContract، سيكون لديك للاحتفال البنود أيضا.

وكبديل يمكن إزالة فقط [DataContract] قبل التعداد الخاصة بك مثل هذا:

public enum Priority
{    
  Low,    
  Medium,    
  High
}

وهذا من شأنه أن يعمل، أيضا، لأنه في هذه الحالة WCF يعالج التعداد في حد ذاته. إذا كنت علامة على أنها [DataContract] لديك للاحتفال كل البند كما لاحظت نفسك.

وكنت الحصول على هذا الخطأ عند عودته حمولة كبيرة، اتضح أن يكون DataContractSerialiser وقف تيار منتصف لأنه قد ضرب الإعداد maxItemsInObjectGraph الافتراضي، إضافة folloing إلى بلدي behavour نقطة النهاية إصلاح المشكلة

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

تأكد من أن لا شيء ليست FaultException يحصل ألقيت ومرت إلى العميل.

ولقد لاحظت هذا عند استخدام LINQ ويدعو مثل تحديد، أين، وما إلى ذلك دون دعوة فورية ل.ToList () أو ToArray (). والمكررات تحصل في ورطة. انهم ليسوا أنواع الأصلية التي WCF يعرف كيفية العمل مع قائمة مثل، مجموعة، الخ انهم من نوع WhereEnumerable أو شيء من هذا. فقط نأخذ ذلك في الاعتبار عند ويرسلون النتائج من NHibernate أو إطار الكيان. أمل أن هذا يساعد شخصاما. أخذني ساعة لمعرفة.

في حالة شخص آخر يقوم به أيضا هذا، وأنا إرجاع قائمة الكائنات التي تم إنشاؤها من قبل LINQ إلى SQL / ملف DBML. أود فقط أن تمكين التسلسل في ملف DBML:

<وأ href = "http://blogs.msdn.com/b/wriju/archive/2007/11/27/linq-to-sql-enabling-dbml-file-for-wcf.aspx" يختلط = "نوفولو"> http://blogs.msdn.com/b/wriju/archive/2007/11/27/linq-to-sql-enabling-dbml-file-for-wcf.aspx

وهتافات

في حالتي كان عقد البيانات الخاصة بي خاصية [datamember] التي لم يكن لديك أسلوب مجموعة. اعتدت أن يترك أثرا WCF الحصول على الخطأ الحقيقي. https://stackoverflow.com/a/4271528/463425 . آمل أن يساعد هذا شخص.

ويمكن أن أكون بعيدا، ولكن قد يكون شيئا الأمن ... لقد حصلت على هذا الخطأ من قبل، وأنا حلها ... لكني لم اكن حتى لعدة أيام في محاولة للحصول على الكثير من الحشرات المختلفة عملت بها .

ولدي المقالة نموذج تفعل شيء أساسي، ولكن أنا باستخدام net.tcp (مع الأمن لتعيين "لا شيء") هنا: <لأ href = "http://www.singingeels.com/Articles/Duplex_WCF_Services_Hosted_in_IIS_Using_NetTcp. ASPX "يختلط =" نوفولو noreferrer "> دوبلكس خدمات WCF مستضافة في IIS عن طريق Net.Tcp

وأيضا، أين أنت الحصول على خطأ ... هل هو على ".Close ()" الخط، أو ".GetTasks (). ToString ()" الخط؟

وآخر شيء يمكن أن تحقق هو مجرد تلنت إلى المضيف المحلي على المنفذ 9999 لمعرفة ما إذا كانت الخدمة الاستماع لincomming الاتصالات تماما.

وأحيانا يمكن أن يكون هذا الخطأ مضللة للغاية. المشترك WCF استثناء: يمكن حدث اتصال إغلاقه بشكل غير متوقع عندما لم يتم تعيين الثقافة بشكل صحيح أو في صيغة سلسلة فضلا

وبعد فشل:

new DateTime(adate.Year, adate.Month, firstday).ToString("d", cultureInfo);

وحين يعمل هذا:

CultureInfo culture = new CultureInfo(this.aculture.Name);               
Convert.ToString(new DateTime(adate.Year, adate.Month, firstday), culture);

وهناك سبب آخر: هذا الاستثناء يأتي إذا كان لديك سمات DataContract/DataMember على Interface بدلا من نوع الخرسانة (<لأ href = "https://stackoverflow.com/questions/3720474/why-cant-my-operation-contracts -في-بي-العميل تمويل رأس المال العامل يحصل على واجهات كما هو والمعلمات "> رهيب فكرة ، لا تفعل ذلك) وتحاول تسلسل Concrete type.

وفي حالتي كان عائدا كائن فئة مخصصة، واحدة من أعضاء الذي كان جدول البيانات. وإذا كنت لا تملك الاسم على DataTable وأنه سوف يرمي هذا الخطأ.

Dim oTable As DataTable = New DataTable 'this wont serialize
Dim oTable As DataTable = New DataTable("MyTable")  'this will serialize

وشخص على هذا الموضوع نشرت أن إضافة هذا العنصر إلى سلوك نقطة النهاية إصلاح المشكلة.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

وهذا يعمل ولكن كان لا بد من واضاف ليس فقط لسلوك نقطة النهاية ولكن سلوك خدمة جدا (وهو أمر منطقي لأن ذلك هو حيث التسلسل ستجري).

إذا تم إضافته إلى خدمة فقط حصلت على هذا الخطأ "الحد الأقصى لعدد العناصر التي يمكن إجراء تسلسل أو إلغاء تسلسل في الرسم البياني الهدف من ذلك هو" 65536 ". تغيير الرسم البياني الكائن أو زيادة الحصص MaxItemsInObjectGraph."

إذا أضيفت إلى نقطة النهاية فقط ما زلت حصلت على اتصال بشكل غير متوقع خطأ مغلقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top