創建WCF服務並部署到IIS,訪問服務器出現錯誤。


************** Exception Text **************
System.ServiceModel.ProtocolException: The content type text/html of the response message does not match the content type of the binding (multipart/related; type="application/xop+xml"). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<title>500 - ?????????????</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>??????????</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>500 - ?'. ---> System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at WindowsFormsApplication1.ULF.IServiceFile.UpLoadFileInfo(CustomFileInfo fileInfo)
   at WindowsFormsApplication1.ULF.ServiceFileClient.UpLoadFileInfo(CustomFileInfo fileInfo) in D:\Documents\Visual Studio 2010\Projects\Text\WindowsFormsApplication1\Service References\ULF\Reference.cs:line 148
   at WindowsFormsApplication1.UpLoadForm.button1_Click(Object sender, EventArgs e) in D:\Documents\Visual Studio 2010\Projects\Text\WindowsFormsApplication1\UpLoadForm.cs:line 61
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

使用瀏覽器打開svc文件完全可以打開。

11 个解决方案

#1


把服務端配置和客戶端配置貼出來吧 ,把代碼貼出來吧

#2


服務端:

<system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" >
      <assemblies>
        <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Data.Services.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Services.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>
    <httpRuntime maxRequestLength="2147483647" executionTimeout="6000" />
  </system.web>
<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="FileTransferServicesBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"
          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:30:00" textEncoding="utf-8">
          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647"/>
          <security mode="None"></security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <!--name為指定要實例化的服務類型,注意此格式-->
      <service name="WebApplication1.ServiceFile" behaviorConfiguration="WebApplication1.ServiceFileBehavior">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="FileTransferServicesBinding"
                  contract="WebApplication1.IServiceFile"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WebApplication1.ServiceFileBehavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
  </system.webServer>
</configuration>


客戶端:

 <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IServiceFile" messageEncoding="Mtom" transferMode="Buffered" textEncoding="utf-8" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://10.0.30.98:8008/ServiceFile.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IServiceFile" contract="ULF.IServiceFile"
        name="BasicHttpBinding_IServiceFile" />
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="metadataBehavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>

#3


兄弟,我發現一個地方我感覺有點不對,你試試 messageEncoding 一個用的是Mtom 另一個用的是text
客戶端和服務端編碼方式不一樣,可能是異常的原因

客戶端  
   <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IServiceFile" messageEncoding="Mtom" transferMode="Buffered" textEncoding="utf-8" />
      </basicHttpBinding>
    </bindings>
服務端
    <bindings>      <basicHttpBinding>        <binding name="FileTransferServicesBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:30:00" textEncoding="utf-8">          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647"/>          <security mode="None"></security>        </binding>      </basicHttpBinding>    </bindings>

#4


引用 3 樓 Ptrtoptr 的回復:
兄弟,我發現一個地方我感覺有點不對,你試試 messageEncoding 一個用的是Mtom 另一個用的是text
客戶端和服務端編碼方式不一樣,可能是異常的原因

客戶端  
   <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IServiceFile" messageEncoding="Mtom" transferMode="Buffered" textEncoding="utf-8" />
      </basicHttpBinding>
    </bindings>
服務端
    <bindings>      <basicHttpBinding>        <binding name="FileTransferServicesBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"          messageEncoding="Text" transferMode="Streamed" sendTimeout="00:30:00" textEncoding="utf-8">          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647"/>          <security mode="None"></security>        </binding>      </basicHttpBinding>    </bindings>


介個我已經改了,還是會出錯。我是在虛擬機上進行的下載測試。虛擬機上放client,我本機上放service,都是處在同一個域中中。看看分析一下是不是還有其它原因。

#5


你訪問的是什么地址?ServiceFile.svc應該是一個空文件,所有實現都寫在cs文件里面的。但是錯誤信息卻出現了訪問某個html文件出錯,完全對不上號。

#6


引用 5 樓 qldsrx 的回復:
你訪問的是什么地址?ServiceFile.svc應該是一個空文件,所有實現都寫在cs文件里面的。但是錯誤信息卻出現了訪問某個html文件出錯,完全對不上號。

因為是我要從服務器上上傳文件,文件上傳成功會返回這個文件的offset,就是從服務器返回一個類文件。不知道為啥會報上面的錯誤。我在本地測試都是可以上傳的。有沒有類似的例子,推薦一個。謝。

#7


這個要看你接口定義是怎么寫的,返回的是什么數據類型。從錯誤部分可以看出,你讓WCF去解析那個要返回的文件,分析到<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>部分時,發現與WCF通信協議不一致,因此報錯,如果你是按照二進制返回而不去解析文件,是不會報錯的。

#8


引用 7 樓 qldsrx 的回復:
這個要看你接口定義是怎么寫的,返回的是什么數據類型。從錯誤部分可以看出,你讓WCF去解析那個要返回的文件,分析到<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>部分時,發現與WCF通信協議不一致,因此報錯,如果你是按照二進制返回而不去解析文件,是不會報錯的。

這個是實現的接口方法:

 public CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo)
        {
            // 獲取服務器文件上傳路徑
            string fileUpLoadPath = System.Web.Hosting.HostingEnvironment.MapPath("~/img/");
            // 如需指定新的文件夾,需要進行創建操作。
            Console.WriteLine("1");
            // 創建FileStream對象
            FileStream fs = new FileStream(fileUpLoadPath + fileInfo.Name, FileMode.OpenOrCreate);
            Console.WriteLine("2");

            long offSet = fileInfo.OffSet;
            // 使用提供的流創建BinaryWriter對象
            var binaryWriter = new BinaryWriter(fs);

            binaryWriter.Seek((int)offSet, SeekOrigin.Begin);
            binaryWriter.Write(fileInfo.SendByte);
            fileInfo.OffSet = fs.Length;
            fileInfo.SendByte = null;

            binaryWriter.Close();
            fs.Close();
            Console.WriteLine("2");
            return fileInfo;
        }

這個是接口:

[ServiceContract]
    public interface IServiceFile
    {
        [OperationContract]
        CustomFileInfo UpLoadFileInfo(CustomFileInfo fileInfo);

        [OperationContract]
        CustomFileInfo GetFileInfo(string fileName);
    }

    [DataContract]
    public class CustomFileInfo
    {
        /// <summary>
        /// 文件名稱
        /// </summary>
        [DataMember]
        public string Name { get; set; }

        /// <summary>
        /// 文件大小
        /// </summary>
        [DataMember]
        public long Length { get; set; }

        /// <summary>
        /// 文件偏移量
        /// </summary>
        [DataMember]
        public long OffSet { get; set; }

        /// <summary>
        /// 發送的字節
        /// </summary>
        [DataMember]
        public byte[] SendByte { get; set; }


    }

#9


看上去那個網頁信息應該是自動產生的錯誤信息,而客戶端不認識。
一、同時刪除客戶端和服務端的messageEncoding設置,因為你兩者不一致,還不如用默認的。
二、修改客戶端 transferMode="Streamed",客戶端用的是Buffered模式。
三、請同步客戶端和服務端的配置文件,相同屬性要保持一致,最好能看懂意思。

#10


四、UpLoadFileInfo方法中不要直接返回fileInfo,里面包含上傳的大量數據。

#11


謝謝樓上2位,問題解決了。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com