私はWCF4.0テンプレート- REST を使っています。私はストリームを使用してファイルをアップロードするメソッドを作成しようとしています。
問題は常に発生します
Stream serverStream = request.GetRequestStream();
ストリーミング用のクラス:
namespace LogicClass
{
public class StreamClass : IStreamClass
{
public bool UploadFile(string filename, Stream fileStream)
{
try
{
FileStream fileToupload = new FileStream(filename, FileMode.Create);
byte[] bytearray = new byte[10000];
int bytesRead, totalBytesRead = 0;
do
{
bytesRead = fileStream.Read(bytearray, 0, bytearray.Length);
totalBytesRead += bytesRead;
} while (bytesRead > 0);
fileToupload.Write(bytearray, 0, bytearray.Length);
fileToupload.Close();
fileToupload.Dispose();
}
catch (Exception ex) { throw new Exception(ex.Message); }
return true;
}
}
}
RESTプロジェクト:
[WebInvoke(UriTemplate = "AddStream/{filename}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
public bool AddStream(string filename, System.IO.Stream fileStream)
{
LogicClass.FileComponent rest = new LogicClass.FileComponent();
return rest.AddStream(filename, fileStream);
}
Windowsフォームプロジェクト:テスト用
private void button24_Click(object sender, EventArgs e)
{
byte[] fileStream;
using (FileStream fs = new FileStream("E:\\stream.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
{
fileStream = new byte[fs.Length];
fs.Read(fileStream, 0, (int)fs.Length);
fs.Close();
fs.Dispose();
}
string baseAddress = "http://localhost:3446/File/AddStream/stream.txt";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress);
request.Method = "POST";
request.ContentType = "text/plain";
Stream serverStream = request.GetRequestStream();
serverStream.Write(fileStream, 0, fileStream.Length);
serverStream.Close();
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
int statusCode = (int)response.StatusCode;
StreamReader reader = new StreamReader(response.GetResponseStream());
}
}
ファイアウォールとインターネット接続をオフにしましたが、それでもエラーが発生します。アップロード方法をテストするより良い方法はありますか?
スタックトレース:
system.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot、SocketAddress socketAddress)at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure、Socket s4、Socket s6、ソケットとソケット、IPアドレスとアドレス、ConnectSocketState状態、IAsyncResult asyncResult、Int32タイムアウト、例外と例外)
「積極的に拒否した」とは、接続しようとしたときにホストがackではなくリセットを送信したことを意味します。したがって、それはあなたのコードでは問題になりません。接続をブロックしているファイアウォールがあるか、サービスをホストしているプロセスがそのポートで待機していません。まったく実行されていないか、または別のポートでlistenしているためです。
サービスをホストしているプロセスを開始したら、netstat -anb
(管理者権限が必要)を試して、サービスが実行中であり、予想されるポートで待機していることを確認します。
更新:Linuxでは、代わりにnetstat -anp
を実行する必要があるかもしれません。
PCを再起動する必要はありません。代わりにIISを再起動してください。
- > 'cmd'(管理者として)を実行し、「iisreset」と入力します。
私の現在のプロジェクトでは、TCPエラーコード10061:ターゲットマシンが積極的に拒否したため、接続できませんでしたのようなエラーメッセージが表示されます。この10061エラーコードは、サービスエンドポイントが開始されていない場合と、ファイアウォールによってブロックされている場合を区別できません。多くの場合、ファイアウォールはオフにすることができますが、問題はまだそこにあります。
以下の2つの方法でコードをテストできます。
上記の私の修正です。それは私のマシン上で動作します。私はそれが役立つことを願っています!
あなたはあなたのシステムのプロキシを設定しなければなりません
私は同様の問題を抱えていました。私の場合、サービスは開発者のマシンではうまく機能しますが、QAマシンでは失敗します。 QAマシンでは、アプリケーションは管理者として実行されておらず、エンドポイントを登録する権限がありませんでした。
HTTPはURLを登録できませんでした http:// +:12345/Foo.svc /] 。あなたのプロセスはこの名前空間へのアクセス権を持っていません(詳細については http://go.Microsoft.com/fwlink/?LinkId=7035 をご覧ください)。
管理ユーザーにならずに機能させる方法はこちらを参照してください。 https://stackoverflow.com/a/885765/38258
他のプログラムがそのポートを使用していないか確認してください。
同じプログラムのインスタンスがまだアクティブな場合は、そのプロセスを強制終了してください。
私はlocalhostと127.0.0.1を拒否する同様の問題を抱えていました。 cmd(admin)netstat -anb
は169.254.80.80で動いているポートを見つけました(このIPを入れた後に働いた。私のネットワークIPは10.0.0.5であったので、IPが由来したことは知らなかった。これは正しいIPを与えます:
IPAddress ipAddress = ipHostInfo.AddressList[0];
Console.WriteLine(ipAddress.ToString());
WCFストームを使用している場合は、WCFサービスエンドポイントにもログインできますか?そうでなく、あなたがそれをWindowsサービスでホストしているのなら、あなたはおそらくその名前空間を登録するのを忘れていました。この手順が必要であることはあまり宣伝されていませんが、実際に行うのは面倒です。
私はこれを行うために このツールを使用します 。面倒な手順はすべて自動化されています。
私はまたC#での.NET Remoting Serviceで問題に直面しました。
私はそれを3つのステップで解決しました:
@Yaurのおかげで、このエラーでトレースすることができました。サービス(WCF)が実行されているかどうかを基本的に確認し、さらに事前のファイアウォール設定で発信および着信TCPプロパティを確認する必要があります。
私は同様の問題を抱えていました。私の場合はPsiphonなどのVPNプロキシアプリがWindowsでプロキシ設定を変更したのでこれに従ってください。
windows 10では、手動でプロキシ設定を変更し、プロキシサーバーを使用するように変更してください。
私のウェブサーバでも同じ問題がありました。私は管理者にWebサーバのポート5672を開くように頼みました、そしてそれはそれでうまくいきました。
WebページのファイルWeb.config内のポート番号が、 IIS でホストされているものと同じであるかどうかを確認してください。
同様のパターンで、私の残りのクライアントはサービスAPIを呼び出しています。デバッグ時にサービスは正常に呼び出されましたが、公開されたコードでは動作していません。エラーは次のとおりです。リモートサーバーに接続できません。
内部例外:System.Net.Sockets.SocketException(0x80004005):ターゲットマシンがアクティブにサービスを拒否したため、接続できませんでしたserviceIP:443(System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot、SocketAddress socketAddress)at System.Net) .ServicePoint.ConnectSocketInternal(ブールconnectFailure、ソケットs4、ソケットs6、ソケットとソケット、IPアドレスとアドレス、ConnectSocketState状態、IAsyncResult asyncResult、例外と例外)
解決策:Web設定でプロキシを設定します。
<system.net>
<defaultProxy useDefaultCredentials="true">
<proxy proxyaddress="http://proxy_ip:portno/" usesystemdefault="True"/>
</defaultProxy>
</system.net>
アプリケーションで使用されているすべてのサービスがオンになっていることを確認します。これらのサービスは、ホストとポートを使用してそれらを利用します。たとえば、私の場合のように、このエラーが発生する可能性があります。アプリケーションがRedisサーバーを利用していて、特定のポートおよびホストでそれに接続できない場合は、このエラーが発生します。